提交 e81df1d2 编写于 作者: A Andreas Scherbaum

Making available array functions back ported from PG 8.4

Fixing the issue #482 with missing pg_proc references to the array manipulation
functions. This PR also back ports the regression tests for arrays from PG 8.4
上级 4008ba84
{ {
"__comment" : "Generated by tidycat.pl version 34 on Fri Mar 18 17:02:54 2016 CATALOG_VERSION_NO=300705111", "__comment" : "Generated by tidycat.pl version 34 on Tue Mar 22 11:22:32 2016 CATALOG_VERSION_NO=300705112",
"__info" : { "__info" : {
"CATALOG_VERSION_NO" : "300705111" "CATALOG_VERSION_NO" : "300705112"
}, },
"gp_configuration" : { "gp_configuration" : {
"CamelCaseRelationId" : "GpConfigurationRelationId", "CamelCaseRelationId" : "GpConfigurationRelationId",
......
...@@ -56,6 +56,6 @@ ...@@ -56,6 +56,6 @@
*/ */
/* 3yyymmddN */ /* 3yyymmddN */
#define CATALOG_VERSION_NO 300705111 #define CATALOG_VERSION_NO 300705112
#endif #endif
...@@ -1087,6 +1087,9 @@ DATA(insert OID = 393 ( array_le PGNSP PGUID 12 1 0 f f t f i 2 16 "2277 22 ...@@ -1087,6 +1087,9 @@ DATA(insert OID = 393 ( array_le PGNSP PGUID 12 1 0 f f t f i 2 16 "2277 22
DESCR("array less than or equal"); DESCR("array less than or equal");
DATA(insert OID = 396 ( array_ge PGNSP PGUID 12 1 0 f f t f i 2 16 "2277 2277" _null_ _null_ _null_ array_ge - _null_ )); DATA(insert OID = 396 ( array_ge PGNSP PGUID 12 1 0 f f t f i 2 16 "2277 2277" _null_ _null_ _null_ array_ge - _null_ ));
DESCR("array greater than or equal"); DESCR("array greater than or equal");
/* TODO: array_ndims OID is 748 */
DATA(insert OID = 3400 ( array_ndims PGNSP PGUID 12 1 0 f f t f i 1 23 "2277" _null_ _null_ _null_ array_ndims - _null_ ));
DESCR("array dimensions");
DATA(insert OID = 747 ( array_dims PGNSP PGUID 12 1 0 f f t f i 1 25 "2277" _null_ _null_ _null_ array_dims - _null_ )); DATA(insert OID = 747 ( array_dims PGNSP PGUID 12 1 0 f f t f i 1 25 "2277" _null_ _null_ _null_ array_dims - _null_ ));
DESCR("array dimensions"); DESCR("array dimensions");
DATA(insert OID = 750 ( array_in PGNSP PGUID 12 1 0 f f t f s 3 2277 "2275 26 23" _null_ _null_ _null_ array_in - _null_ )); DATA(insert OID = 750 ( array_in PGNSP PGUID 12 1 0 f f t f s 3 2277 "2275 26 23" _null_ _null_ _null_ array_in - _null_ ));
...@@ -1098,6 +1101,9 @@ DATA(insert OID = 2091 ( array_lower PGNSP PGUID 12 1 0 f f t f i 2 23 "2277 ...@@ -1098,6 +1101,9 @@ DATA(insert OID = 2091 ( array_lower PGNSP PGUID 12 1 0 f f t f i 2 23 "2277
DESCR("array lower dimension"); DESCR("array lower dimension");
DATA(insert OID = 2092 ( array_upper PGNSP PGUID 12 1 0 f f t f i 2 23 "2277 23" _null_ _null_ _null_ array_upper - _null_ )); DATA(insert OID = 2092 ( array_upper PGNSP PGUID 12 1 0 f f t f i 2 23 "2277 23" _null_ _null_ _null_ array_upper - _null_ ));
DESCR("array upper dimension"); DESCR("array upper dimension");
/* TODO: array_length OID is 2176 */
DATA(insert OID = 3401 ( array_length PGNSP PGUID 12 1 0 f f t f i 2 23 "2277 23" _null_ _null_ _null_ array_length - _null_ ));
DESCR("array length");
DATA(insert OID = 378 ( array_append PGNSP PGUID 12 1 0 f f f f i 2 2277 "2277 2283" _null_ _null_ _null_ array_push - _null_ )); DATA(insert OID = 378 ( array_append PGNSP PGUID 12 1 0 f f f f i 2 2277 "2277 2283" _null_ _null_ _null_ array_push - _null_ ));
DESCR("append element onto end of array"); DESCR("append element onto end of array");
DATA(insert OID = 379 ( array_prepend PGNSP PGUID 12 1 0 f f f f i 2 2277 "2283 2277" _null_ _null_ _null_ array_push - _null_ )); DATA(insert OID = 379 ( array_prepend PGNSP PGUID 12 1 0 f f f f i 2 2277 "2283 2277" _null_ _null_ _null_ array_push - _null_ ));
...@@ -1114,6 +1120,18 @@ DATA(insert OID = 515 ( array_larger PGNSP PGUID 12 1 0 f f t f i 2 2277 "22 ...@@ -1114,6 +1120,18 @@ DATA(insert OID = 515 ( array_larger PGNSP PGUID 12 1 0 f f t f i 2 2277 "22
DESCR("larger of two"); DESCR("larger of two");
DATA(insert OID = 516 ( array_smaller PGNSP PGUID 12 1 0 f f t f i 2 2277 "2277 2277" _null_ _null_ _null_ array_smaller - _null_ )); DATA(insert OID = 516 ( array_smaller PGNSP PGUID 12 1 0 f f t f i 2 2277 "2277 2277" _null_ _null_ _null_ array_smaller - _null_ ));
DESCR("smaller of two"); DESCR("smaller of two");
/* TODO: generate_subscripts OID is 1191 */
DATA(insert OID = 3402 ( generate_subscripts PGNSP PGUID 12 1 1000 f f t t i 3 23 "2277 23 16" _null_ _null_ _null_ generate_subscripts - _null_ ));
DESCR("array subscripts generator");
/* TODO: generate_subscripts OID is 1192 */
DATA(insert OID = 3403 ( generate_subscripts PGNSP PGUID 12 1 1000 f f t t i 2 23 "2277 23" _null_ _null_ _null_ generate_subscripts_nodir - _null_ ));
DESCR("array subscripts generator");
/* TODO: array_fill OID is 1193 */
DATA(insert OID = 3404 ( array_fill PGNSP PGUID 12 1 0 f f f f i 2 2277 "2283 1007" _null_ _null_ _null_ array_fill - _null_ ));
DESCR("array constructor with value");
/* TODO: array_fill OID is 1286 */
DATA(insert OID = 3405 ( array_fill PGNSP PGUID 12 1 0 f f f f i 3 2277 "2283 1007 1007" _null_ _null_ _null_ array_fill_with_lower_bounds - _null_ ));
DESCR("array constructor with value");
DATA(insert OID = 760 ( smgrin PGNSP PGUID 12 1 0 f f t f s 1 210 "2275" _null_ _null_ _null_ smgrin - _null_ )); DATA(insert OID = 760 ( smgrin PGNSP PGUID 12 1 0 f f t f s 1 210 "2275" _null_ _null_ _null_ smgrin - _null_ ));
DESCR("I/O"); DESCR("I/O");
......
...@@ -68,9 +68,15 @@ SELECT a[1:3], ...@@ -68,9 +68,15 @@ SELECT a[1:3],
{11,12,23} | {} | {foobar} | {{elt1,elt2}} {11,12,23} | {} | {foobar} | {{elt1,elt2}}
(3 rows) (3 rows)
-- array_ndims exists in postgres, but not in gp SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c
-- SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c FROM arrtest ORDER BY 1,2,3;
a | b | c
---+---+---
1 | 2 | 1
1 | 3 |
| 1 | 1
(3 rows)
SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c
FROM arrtest ORDER BY 1,2; FROM arrtest ORDER BY 1,2;
a | b | c a | b | c
...@@ -673,7 +679,12 @@ select null::int = any ('{1,2,3}'); ...@@ -673,7 +679,12 @@ select null::int = any ('{1,2,3}');
(1 row) (1 row)
-- select 33 = any ('{1,null,3}'); -- MPP: 11852 select 33 = any ('{1,null,3}');
?column?
----------
(1 row)
select 33 = any ('{1,null,33}'); select 33 = any ('{1,null,33}');
?column? ?column?
---------- ----------
...@@ -913,3 +924,255 @@ SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; ...@@ -913,3 +924,255 @@ SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest;
{4,2,6,7,8,1} | {} | {{white,yellow},{pink,orange}} | {{black,red},{green,orange}} | {2.1,3.3,1.8,1.7,1.6} | {1.6} {4,2,6,7,8,1} | {} | {{white,yellow},{pink,orange}} | {{black,red},{green,orange}} | {2.1,3.3,1.8,1.7,1.6} | {1.6}
(1 row) (1 row)
create or replace function unnest1(anyarray)
returns setof anyelement as $$
select $1[s] from generate_subscripts($1,1) g(s);
$$ language sql immutable;
create or replace function unnest2(anyarray)
returns setof anyelement as $$
select $1[s1][s2] from generate_subscripts($1,1) g1(s1),
generate_subscripts($1,2) g2(s2);
$$ language sql immutable;
select * from unnest1(array[1,2,3]);
unnest1
---------
1
2
3
(3 rows)
select * from unnest2(array[[1,2,3],[4,5,6]]);
unnest2
---------
1
2
3
4
5
6
(6 rows)
drop function unnest1(anyarray);
drop function unnest2(anyarray);
select array_fill(null::integer, array[3,3],array[2,2]);
array_fill
-----------------------------------------------------------------
[2:4][2:4]={{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}
(1 row)
select array_fill(null::integer, array[3,3]);
array_fill
------------------------------------------------------
{{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}
(1 row)
select array_fill(null::text, array[3,3],array[2,2]);
array_fill
-----------------------------------------------------------------
[2:4][2:4]={{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}
(1 row)
select array_fill(null::text, array[3,3]);
array_fill
------------------------------------------------------
{{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}
(1 row)
select array_fill(7, array[3,3],array[2,2]);
array_fill
--------------------------------------
[2:4][2:4]={{7,7,7},{7,7,7},{7,7,7}}
(1 row)
select array_fill(7, array[3,3]);
array_fill
---------------------------
{{7,7,7},{7,7,7},{7,7,7}}
(1 row)
select array_fill('juhu'::text, array[3,3],array[2,2]);
array_fill
-----------------------------------------------------------------
[2:4][2:4]={{juhu,juhu,juhu},{juhu,juhu,juhu},{juhu,juhu,juhu}}
(1 row)
select array_fill('juhu'::text, array[3,3]);
array_fill
------------------------------------------------------
{{juhu,juhu,juhu},{juhu,juhu,juhu},{juhu,juhu,juhu}}
(1 row)
-- raise exception
select array_fill(1, null, array[2,2]);
ERROR: dimension array or low bound array cannot be NULL
select array_fill(1, array[2,2], null);
ERROR: dimension array or low bound array cannot be NULL
select array_fill(1, array[3,3], array[1,1,1]);
ERROR: wrong number of array subscripts
DETAIL: Low bound array has different size than dimensions array.
select array_fill(1, array[1,2,null]);
ERROR: dimension values cannot be null
select string_to_array('1|2|3', '|');
string_to_array
-----------------
{1,2,3}
(1 row)
select string_to_array('1|2|3|', '|');
string_to_array
-----------------
{1,2,3,""}
(1 row)
select string_to_array('1||2|3||', '||');
string_to_array
-----------------
{1,2|3,""}
(1 row)
select string_to_array('1|2|3', '');
string_to_array
-----------------
{1|2|3}
(1 row)
select string_to_array('', '|');
string_to_array
-----------------
(1 row)
select string_to_array('1|2|3', NULL);
string_to_array
-----------------
(1 row)
select string_to_array(NULL, '|');
string_to_array
-----------------
(1 row)
select array_to_string(string_to_array('1|2|3', '|'), '|');
array_to_string
-----------------
1|2|3
(1 row)
select array_length(array[1,2,3], 1);
array_length
--------------
3
(1 row)
select array_length(array[[1,2,3], [4,5,6]], 0);
array_length
--------------
(1 row)
select array_length(array[[1,2,3], [4,5,6]], 1);
array_length
--------------
2
(1 row)
select array_length(array[[1,2,3], [4,5,6]], 2);
array_length
--------------
3
(1 row)
select array_length(array[[1,2,3], [4,5,6]], 3);
array_length
--------------
(1 row)
select array_agg(unique1 order by unique1) from (select unique1 from tenk1 where unique1 < 15 order by unique1) ss;
array_agg
--------------------------------------
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}
(1 row)
select array_agg(ten order by ten) from (select ten from tenk1 where unique1 < 15 order by unique1) ss;
array_agg
---------------------------------
{0,0,1,1,2,2,3,3,4,4,5,6,7,8,9}
(1 row)
select array_agg(nullif(ten, 4) order by ten) from (select ten from tenk1 where unique1 < 15 order by unique1) ss;
array_agg
---------------------------------------
{0,0,1,1,2,2,3,3,NULL,NULL,5,6,7,8,9}
(1 row)
select array_agg(unique1 order by unique1) from tenk1 where unique1 < -15;
array_agg
-----------
(1 row)
select unnest(array[1,2,3]);
unnest
--------
1
2
3
(3 rows)
select * from unnest(array[1,2,3]);
unnest
--------
1
2
3
(3 rows)
select unnest(array[1,2,3,4.5]::float8[]);
unnest
--------
1
2
3
4.5
(4 rows)
select unnest(array[1,2,3,4.5]::numeric[]);
unnest
--------
1
2
3
4.5
(4 rows)
select unnest(array[1,2,3,null,4,null,null,5,6]);
unnest
--------
1
2
3
4
5
6
(9 rows)
select unnest(array[1,2,3,null,4,null,null,5,6]::text[]);
unnest
--------
1
2
3
4
5
6
(9 rows)
...@@ -53,9 +53,8 @@ SELECT a[1:3], ...@@ -53,9 +53,8 @@ SELECT a[1:3],
d[1:1][1:2] d[1:1][1:2]
FROM arrtest ORDER BY 1,2,3,4; FROM arrtest ORDER BY 1,2,3,4;
-- array_ndims exists in postgres, but not in gp SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c
-- SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c FROM arrtest ORDER BY 1,2,3;
SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c
FROM arrtest ORDER BY 1,2; FROM arrtest ORDER BY 1,2;
...@@ -240,7 +239,7 @@ select 33 * any (44); ...@@ -240,7 +239,7 @@ select 33 * any (44);
-- nulls -- nulls
select 33 = any (null::int[]); select 33 = any (null::int[]);
select null::int = any ('{1,2,3}'); select null::int = any ('{1,2,3}');
-- select 33 = any ('{1,null,3}'); -- MPP: 11852 select 33 = any ('{1,null,3}');
select 33 = any ('{1,null,33}'); select 33 = any ('{1,null,33}');
select 33 = all (null::int[]); select 33 = all (null::int[]);
select null::int = all ('{1,2,3}'); select null::int = all ('{1,2,3}');
...@@ -328,3 +327,62 @@ SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; ...@@ -328,3 +327,62 @@ SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest;
INSERT INTO arraggtest (f1, f2, f3) VALUES INSERT INTO arraggtest (f1, f2, f3) VALUES
('{}','{{pink,white,blue,red,grey,orange}}','{2.1,1.87,1.4,2.2}'); ('{}','{{pink,white,blue,red,grey,orange}}','{2.1,1.87,1.4,2.2}');
SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest;
create or replace function unnest1(anyarray)
returns setof anyelement as $$
select $1[s] from generate_subscripts($1,1) g(s);
$$ language sql immutable;
create or replace function unnest2(anyarray)
returns setof anyelement as $$
select $1[s1][s2] from generate_subscripts($1,1) g1(s1),
generate_subscripts($1,2) g2(s2);
$$ language sql immutable;
select * from unnest1(array[1,2,3]);
select * from unnest2(array[[1,2,3],[4,5,6]]);
drop function unnest1(anyarray);
drop function unnest2(anyarray);
select array_fill(null::integer, array[3,3],array[2,2]);
select array_fill(null::integer, array[3,3]);
select array_fill(null::text, array[3,3],array[2,2]);
select array_fill(null::text, array[3,3]);
select array_fill(7, array[3,3],array[2,2]);
select array_fill(7, array[3,3]);
select array_fill('juhu'::text, array[3,3],array[2,2]);
select array_fill('juhu'::text, array[3,3]);
-- raise exception
select array_fill(1, null, array[2,2]);
select array_fill(1, array[2,2], null);
select array_fill(1, array[3,3], array[1,1,1]);
select array_fill(1, array[1,2,null]);
select string_to_array('1|2|3', '|');
select string_to_array('1|2|3|', '|');
select string_to_array('1||2|3||', '||');
select string_to_array('1|2|3', '');
select string_to_array('', '|');
select string_to_array('1|2|3', NULL);
select string_to_array(NULL, '|');
select array_to_string(string_to_array('1|2|3', '|'), '|');
select array_length(array[1,2,3], 1);
select array_length(array[[1,2,3], [4,5,6]], 0);
select array_length(array[[1,2,3], [4,5,6]], 1);
select array_length(array[[1,2,3], [4,5,6]], 2);
select array_length(array[[1,2,3], [4,5,6]], 3);
select array_agg(unique1 order by unique1) from (select unique1 from tenk1 where unique1 < 15 order by unique1) ss;
select array_agg(ten order by ten) from (select ten from tenk1 where unique1 < 15 order by unique1) ss;
select array_agg(nullif(ten, 4) order by ten) from (select ten from tenk1 where unique1 < 15 order by unique1) ss;
select array_agg(unique1 order by unique1) from tenk1 where unique1 < -15;
select unnest(array[1,2,3]);
select * from unnest(array[1,2,3]);
select unnest(array[1,2,3,4.5]::float8[]);
select unnest(array[1,2,3,4.5]::numeric[]);
select unnest(array[1,2,3,null,4,null,null,5,6]);
select unnest(array[1,2,3,null,4,null,null,5,6]::text[]);
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册