github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/sql/logictest/testdata/logic_test/array (about)

     1  # LogicTest: !3node-tenant
     2  # pg arrays must preserve control characters when converted to string,
     3  # but their direct representation as string does not escape the
     4  # control characters. In order for the test file to remain valid
     5  # printable UTF-8, we double-escape the representations below.
     6  
     7  statement ok
     8  SET bytea_output = escape
     9  
    10  # array construction
    11  
    12  query error cannot determine type of empty array
    13  SELECT ARRAY[]
    14  
    15  query T
    16  SELECT ARRAY[1, 2, 3]
    17  ----
    18  {1,2,3}
    19  
    20  statement ok
    21  CREATE TABLE k (
    22    k INT PRIMARY KEY
    23  )
    24  
    25  statement ok
    26  INSERT INTO k VALUES (1), (2), (3), (4), (5)
    27  
    28  query T rowsort
    29  SELECT ARRAY[k] FROM k
    30  ----
    31  {1}
    32  {2}
    33  {3}
    34  {4}
    35  {5}
    36  
    37  query error expected 1 to be of type bool, found type int
    38  SELECT ARRAY['a', true, 1]
    39  
    40  query T
    41  SELECT ARRAY['a,', 'b{', 'c}', 'd', 'e f']
    42  ----
    43  {"a,","b{","c}",d,"e f"}
    44  
    45  query T
    46  SELECT ARRAY['1}'::BYTES]
    47  ----
    48  {"\\x317d"}
    49  
    50  # TODO(jordan): #16487
    51  # query T
    52  # SELECT ARRAY[e'g\x10h']
    53  # ----
    54  # {g\x10h}
    55  
    56  query TTTTTTT
    57  SELECT '', 'NULL', 'Null', 'null', NULL, '"', e'\''
    58  ----
    59  ·  NULL  Null  null  NULL  "  '
    60  
    61  query T
    62  SELECT ARRAY['', 'NULL', 'Null', 'null', NULL, '"', e'\'']
    63  ----
    64  {"","NULL","Null","null",NULL,"\"",'}
    65  
    66  query T
    67  SELECT NULL::INT[]
    68  ----
    69  NULL
    70  
    71  query TTTT
    72  SELECT
    73    ARRAY[NULL]::STRING[],
    74    ARRAY[NULL]::INT[],
    75    ARRAY[NULL]::FLOAT[],
    76    ARRAY[NULL]::TIMESTAMP[]
    77  ----
    78  {NULL} {NULL} {NULL} {NULL}
    79  
    80  query BB
    81  SELECT NULL::INT[] IS DISTINCT FROM NULL, ARRAY[1,2,3] IS DISTINCT FROM NULL
    82  ----
    83  false true
    84  
    85  # #19821
    86  
    87  query T
    88  SELECT ARRAY['one', 'two', 'fünf']
    89  ----
    90  {one,two,fünf}
    91  
    92  query T
    93  SELECT ARRAY[e'\n', e'g\x10h']::STRING::BYTES::STRING
    94  ----
    95  {"\012",g\020h}
    96  
    97  query T
    98  SELECT ARRAY['foo', 'bar']
    99  ----
   100  {foo,bar}
   101  
   102  # array construction from subqueries
   103  
   104  query T
   105  SELECT ARRAY(SELECT 3 WHERE false)
   106  ----
   107  {}
   108  
   109  statement ok
   110  SELECT ARRAY(SELECT 3 WHERE false) FROM k
   111  
   112  query T
   113  SELECT ARRAY(SELECT 3)
   114  ----
   115  {3}
   116  
   117  query T
   118  SELECT ARRAY(VALUES (1),(2),(1))
   119  ----
   120  {1,2,1}
   121  
   122  statement error arrays cannot have arrays as element type
   123  SELECT ARRAY(VALUES (ARRAY[1]))
   124  
   125  query T
   126  SELECT ARRAY(VALUES ('a'),('b'),('c'))
   127  ----
   128  {a,b,c}
   129  
   130  
   131  # TODO(justin): uncomment when #32715 is fixed.
   132  # query T
   133  # SELECT ARRAY(SELECT (1,2))
   134  # ----
   135  # {"(1,2)"}
   136  
   137  query error subquery must return only one column, found 2
   138  SELECT ARRAY(SELECT 1, 2)
   139  
   140  query T
   141  SELECT ARRAY[]:::int[]
   142  ----
   143  {}
   144  
   145  # casting strings to arrays
   146  
   147  query T
   148  SELECT '{1,2,3}'::INT[]
   149  ----
   150  {1,2,3}
   151  
   152  query T
   153  SELECT '{hello,"hello"}'::STRING[]
   154  ----
   155  {hello,hello}
   156  
   157  query T
   158  SELECT e'{he\\\\llo}'::STRING[]
   159  ----
   160  {"he\\llo"}
   161  
   162  query T
   163  SELECT '{"abc\nxyz"}'::STRING[]
   164  ----
   165  {abcnxyz}
   166  
   167  query T
   168  SELECT '{hello}'::VARCHAR(2)[]
   169  ----
   170  {he}
   171  
   172  # array casting
   173  
   174  query T
   175  SELECT ARRAY['foo']::STRING
   176  ----
   177  {foo}
   178  
   179  query T
   180  SELECT ARRAY[e'foo\nbar']::STRING::BYTES::STRING
   181  ----
   182  {"foo\012bar"}
   183  
   184  query TTTTTT
   185  SELECT
   186    ARRAY[e'foo\000bar']::STRING::BYTES::STRING,
   187    ARRAY[e'foo\001bar']::STRING::BYTES::STRING,
   188    ARRAY[e'foo\002bar']::STRING::BYTES::STRING,
   189    ARRAY[e'foo\030bar']::STRING::BYTES::STRING,
   190    ARRAY[e'foo\034bar']::STRING::BYTES::STRING,
   191    ARRAY[e'foo\100bar']::STRING::BYTES::STRING
   192  ----
   193  {foo\000bar}  {foo\001bar}  {foo\002bar}  {foo\030bar}  {foo\034bar}  {foo@bar}
   194  
   195  query T
   196  SELECT ARRAY[1,2,3]::INT[]
   197  ----
   198  {1,2,3}
   199  
   200  query error invalid cast: int[] -> UUID[]
   201  SELECT ARRAY[1,2,3]::UUID[]
   202  
   203  query error invalid cast: inet[] -> INT[]
   204  SELECT ARRAY['8.8.8.8'::INET, '8.8.4.4'::INET]::INT[]
   205  
   206  query T
   207  SELECT ARRAY[1,2,3]::TEXT[]
   208  ----
   209  {1,2,3}
   210  
   211  query T
   212  SELECT ARRAY[1,2,3]::INT2VECTOR
   213  ----
   214  {1,2,3}
   215  
   216  # array subscript access
   217  
   218  query T
   219  SELECT ARRAY['a', 'b', 'c'][-1]
   220  ----
   221  NULL
   222  
   223  query T
   224  SELECT ARRAY['a', 'b', 'c'][0]
   225  ----
   226  NULL
   227  
   228  query T
   229  SELECT (ARRAY['a', 'b', 'c'])[2]
   230  ----
   231  b
   232  
   233  query T
   234  SELECT ARRAY['a', 'b', 'c'][2]
   235  ----
   236  b
   237  
   238  query T
   239  SELECT ARRAY['a', 'b', 'c'][4]
   240  ----
   241  NULL
   242  
   243  query T
   244  SELECT ARRAY['a', 'b', 'c'][1.5 + 1.5]
   245  ----
   246  c
   247  
   248  query I
   249  SELECT ARRAY[1, 2, 3][-1]
   250  ----
   251  NULL
   252  
   253  query I
   254  SELECT ARRAY[1, 2, 3][0]
   255  ----
   256  NULL
   257  
   258  query I
   259  SELECT ARRAY[1, 2, 3][2]
   260  ----
   261  2
   262  
   263  query I
   264  SELECT ARRAY[1, 2, 3][4]
   265  ----
   266  NULL
   267  
   268  query I
   269  SELECT ARRAY[1, 2, 3][1.5 + 1.5]
   270  ----
   271  3
   272  
   273  query error unimplemented: multidimensional indexing
   274  SELECT ARRAY['a', 'b', 'c'][4][2]
   275  
   276  query error incompatible ARRAY subscript type: decimal
   277  SELECT ARRAY['a', 'b', 'c'][3.5]
   278  
   279  query error could not parse "abc" as type int
   280  SELECT ARRAY['a', 'b', 'c']['abc']
   281  
   282  query error cannot subscript type int because it is not an array
   283  SELECT (123)[2]
   284  
   285  # array slicing
   286  
   287  query error unimplemented: ARRAY slicing
   288  SELECT ARRAY['a', 'b', 'c'][:]
   289  
   290  query error unimplemented: ARRAY slicing
   291  SELECT ARRAY['a', 'b', 'c'][1:]
   292  
   293  query error unimplemented: ARRAY slicing
   294  SELECT ARRAY['a', 'b', 'c'][1:2]
   295  
   296  query error unimplemented: ARRAY slicing
   297  SELECT ARRAY['a', 'b', 'c'][:2]
   298  
   299  query error unimplemented: ARRAY slicing
   300  SELECT ARRAY['a', 'b', 'c'][2:1]
   301  
   302  # other forms of indirection
   303  
   304  # From a column name.
   305  query T
   306  SELECT a[1] FROM (SELECT ARRAY['a','b','c'] AS a)
   307  ----
   308  a
   309  
   310  # From a column ordinal.
   311  query T
   312  SELECT @1[1] FROM (SELECT ARRAY['a','b','c'] AS a)
   313  ----
   314  a
   315  
   316  # From a parenthetized expression.
   317  query I
   318  SELECT (ARRAY(VALUES (1),(2),(1)))[2]
   319  ----
   320  2
   321  
   322  # From an ArrayFlatten expression - ARRAY(subquery)[...]
   323  query I
   324  SELECT ARRAY(VALUES (1),(2),(1))[2]
   325  ----
   326  2
   327  
   328  # From a single-column subquery converted to a single datum.
   329  query I
   330  SELECT ((SELECT ARRAY[1, 2, 3]))[3]
   331  ----
   332  3
   333  
   334  # From a subquery.
   335  query T
   336  SELECT (SELECT ARRAY['a', 'b', 'c'])[3]
   337  ----
   338  c
   339  
   340  query T
   341  SELECT ARRAY(SELECT generate_series(1,10) ORDER BY 1 DESC)
   342  ----
   343  {10,9,8,7,6,5,4,3,2,1}
   344  
   345  statement ok
   346  CREATE TABLE z (
   347    x INT PRIMARY KEY,
   348    y INT
   349  )
   350  
   351  statement ok
   352  INSERT INTO z VALUES (1, 5), (2, 4), (3, 3), (4, 2), (5, 1)
   353  
   354  query T
   355  SELECT ARRAY(SELECT x FROM z ORDER BY y)
   356  ----
   357  {5,4,3,2,1}
   358  
   359  # From a function call expression.
   360  query T
   361  SELECT current_schemas(true)[1]
   362  ----
   363  pg_catalog
   364  
   365  # From a CASE sub-expression.
   366  query I
   367  SELECT (CASE 1 = 1 WHEN true THEN ARRAY[1,2] ELSE ARRAY[2,3] END)[1]
   368  ----
   369  1
   370  
   371  # From a tuple.
   372  query error cannot subscript type tuple{int, int, int} because it is not an array
   373  SELECT (1,2,3)[1]
   374  
   375  query error cannot subscript type tuple{int, int, int} because it is not an array
   376  SELECT ROW (1,2,3)[1]
   377  
   378  # Ensure grouping by an array column works
   379  
   380  statement ok
   381  SELECT conkey FROM pg_catalog.pg_constraint GROUP BY conkey
   382  
   383  statement ok
   384  SELECT indkey[0] FROM pg_catalog.pg_index
   385  
   386  # Verify serialization of array in expression (with distsql).
   387  statement ok
   388  CREATE TABLE t (k INT)
   389  
   390  statement ok
   391  INSERT INTO t VALUES (1), (2), (3), (4), (5)
   392  
   393  query I rowsort
   394  SELECT k FROM t WHERE k = ANY ARRAY[2,4]
   395  ----
   396  2
   397  4
   398  
   399  query I rowsort
   400  SELECT k FROM t WHERE k > ANY ARRAY[2,4]
   401  ----
   402  3
   403  4
   404  5
   405  
   406  query I
   407  SELECT k FROM t WHERE k < ALL ARRAY[2,4]
   408  ----
   409  1
   410  
   411  # Undocumented - bounds should be allowed, as in Postgres
   412  statement ok
   413  CREATE TABLE boundedtable (b INT[10], c INT ARRAY[10])
   414  
   415  statement ok
   416  DROP TABLE boundedtable
   417  
   418  # Creating multidimensional arrays should be disallowed.
   419  statement error .*unimplemented.*\nHINT.*\n.*32552
   420  CREATE TABLE badtable (b INT[][])
   421  
   422  # Nested arrays should be disallowed
   423  
   424  query error unimplemented: arrays cannot have arrays as element type.*\nHINT.*\n.*32552
   425  SELECT ARRAY[ARRAY[1,2,3]]
   426  
   427  # The postgres-compat aliases should be disallowed.
   428  # INT2VECTOR is deprecated in Postgres.
   429  
   430  query error VECTOR column types are unsupported
   431  CREATE TABLE badtable (b INT2VECTOR)
   432  
   433  # Regression test for #18745
   434  
   435  statement ok
   436  CREATE TABLE ident (x INT)
   437  
   438  query T
   439  SELECT ARRAY[ROW()] FROM ident
   440  ----
   441  
   442  statement ok
   443  CREATE TABLE a (b INT ARRAY)
   444  
   445  query TT
   446  SHOW CREATE TABLE a
   447  ----
   448  a  CREATE TABLE a (
   449       b INT8[] NULL,
   450       FAMILY "primary" (b, rowid)
   451     )
   452  
   453  statement ok
   454  DROP TABLE a
   455  
   456  # Int array columns.
   457  
   458  statement ok
   459  CREATE TABLE a (b INT[])
   460  
   461  statement ok
   462  INSERT INTO a VALUES (ARRAY[1,2,3])
   463  
   464  query T
   465  SELECT b FROM a
   466  ----
   467  {1,2,3}
   468  
   469  statement ok
   470  DELETE FROM a
   471  
   472  statement ok
   473  INSERT INTO a VALUES (NULL)
   474  
   475  query T
   476  SELECT b FROM a
   477  ----
   478  NULL
   479  
   480  statement ok
   481  DELETE FROM a
   482  
   483  statement ok
   484  INSERT INTO a VALUES (ARRAY[])
   485  
   486  query T
   487  SELECT b FROM a
   488  ----
   489  {}
   490  
   491  statement ok
   492  DELETE FROM a;
   493  
   494  # Make sure arrays originating from ARRAY_AGG work as expected.
   495  
   496  statement ok
   497  INSERT INTO a (SELECT array_agg(generate_series) from generate_series(1,3))
   498  
   499  query T
   500  SELECT * FROM a
   501  ----
   502  {1,2,3}
   503  
   504  query TT
   505  SHOW CREATE TABLE a
   506  ----
   507  a  CREATE TABLE a (
   508       b INT8[] NULL,
   509       FAMILY "primary" (b, rowid)
   510     )
   511  
   512  statement error could not parse "foo" as type int
   513  INSERT INTO a VALUES (ARRAY['foo'])
   514  
   515  statement error could not parse "foo" as type int
   516  INSERT INTO a VALUES (ARRAY[1, 'foo'])
   517  
   518  statement ok
   519  DELETE FROM a
   520  
   521  statement ok
   522  INSERT INTO a VALUES (ARRAY[1,2,3]), (ARRAY[4,5]), (ARRAY[6])
   523  
   524  query I
   525  SELECT b[1] FROM a ORDER BY b[1]
   526  ----
   527  1
   528  4
   529  6
   530  
   531  query I
   532  SELECT b[2] FROM a ORDER BY b[1]
   533  ----
   534  2
   535  5
   536  NULL
   537  
   538  # NULL values
   539  
   540  statement ok
   541  DELETE FROM a
   542  
   543  statement ok
   544  INSERT INTO a VALUES (ARRAY[NULL::INT]), (ARRAY[NULL::INT, 1]), (ARRAY[1, NULL::INT]), (ARRAY[NULL::INT, NULL::INT])
   545  
   546  query T rowsort
   547  SELECT * FROM a
   548  ----
   549  {NULL}
   550  {NULL,1}
   551  {1,NULL}
   552  {NULL,NULL}
   553  
   554  statement ok
   555  DELETE FROM a
   556  
   557  # Test with arrays bigger than 8 elements so the NULL bitmap has to be larger than a byte
   558  
   559  statement ok
   560  INSERT INTO a VALUES (ARRAY[1,2,3,4,5,6,7,8,NULL::INT])
   561  
   562  query T
   563  SELECT * FROM a
   564  ----
   565  {1,2,3,4,5,6,7,8,NULL}
   566  
   567  statement ok
   568  DROP TABLE a
   569  
   570  # Ensure that additional type info stays when used as an array.
   571  
   572  statement ok
   573  CREATE TABLE a (b SMALLINT[])
   574  
   575  query TT
   576  SHOW CREATE TABLE a
   577  ----
   578  a  CREATE TABLE a (
   579     b INT2[] NULL,
   580     FAMILY "primary" (b, rowid)
   581  )
   582  
   583  statement error integer out of range for type int2 \(column "b"\)
   584  INSERT INTO a VALUES (ARRAY[100000])
   585  
   586  statement ok
   587  DROP TABLE a
   588  
   589  # String array columns.
   590  
   591  statement ok
   592  CREATE TABLE a (b STRING[])
   593  
   594  statement ok
   595  INSERT INTO a VALUES (ARRAY['foo', 'bar', 'baz'])
   596  
   597  query T
   598  SELECT b FROM a
   599  ----
   600  {foo,bar,baz}
   601  
   602  statement ok
   603  UPDATE a SET b = ARRAY[]
   604  
   605  query T
   606  SELECT b FROM a
   607  ----
   608  {}
   609  
   610  # Test NULLs with strings
   611  
   612  statement ok
   613  DELETE FROM a
   614  
   615  statement ok
   616  INSERT INTO a VALUES (ARRAY[NULL::STRING, NULL::STRING, NULL::STRING, NULL::STRING, NULL::STRING, NULL::STRING, 'G'])
   617  
   618  query T
   619  SELECT * FROM a
   620  ----
   621  {NULL,NULL,NULL,NULL,NULL,NULL,G}
   622  
   623  statement ok
   624  DROP TABLE a
   625  
   626  # Bool array columns.
   627  
   628  statement ok
   629  CREATE TABLE a (b BOOL[])
   630  
   631  statement ok
   632  INSERT INTO a VALUES (ARRAY[]), (ARRAY[TRUE]), (ARRAY[FALSE]), (ARRAY[TRUE, TRUE]), (ARRAY[FALSE, TRUE])
   633  
   634  query T rowsort
   635  SELECT b FROM a
   636  ----
   637  {}
   638  {t}
   639  {f}
   640  {t,t}
   641  {f,t}
   642  
   643  statement ok
   644  DROP TABLE a
   645  
   646  # Float array columns.
   647  
   648  statement ok
   649  CREATE TABLE a (b FLOAT[])
   650  
   651  statement ok
   652  INSERT INTO a VALUES (ARRAY[1.1, 2.2, 3.3])
   653  
   654  query T
   655  SELECT b FROM a
   656  ----
   657  {1.1,2.2,3.3}
   658  
   659  statement ok
   660  DROP TABLE a
   661  
   662  # Decimal array columns.
   663  
   664  statement ok
   665  CREATE TABLE a (b DECIMAL[])
   666  
   667  statement ok
   668  INSERT INTO a VALUES (ARRAY[1.1, 2.2, 3.3])
   669  
   670  query T
   671  SELECT b FROM a
   672  ----
   673  {1.1,2.2,3.3}
   674  
   675  statement ok
   676  DROP TABLE a
   677  
   678  # Bytes array columns.
   679  
   680  statement ok
   681  CREATE TABLE a (b BYTES[])
   682  
   683  statement ok
   684  INSERT INTO a VALUES (ARRAY['foo','bar','baz'])
   685  
   686  query T
   687  SELECT b FROM a
   688  ----
   689  {"\\x666f6f","\\x626172","\\x62617a"}
   690  
   691  statement ok
   692  DROP TABLE a
   693  
   694  # Date array columns.
   695  
   696  statement ok
   697  CREATE TABLE a (b DATE[])
   698  
   699  statement ok
   700  INSERT INTO a VALUES (ARRAY[current_date])
   701  
   702  query I
   703  SELECT count(b) FROM a
   704  ----
   705  1
   706  
   707  statement ok
   708  DROP TABLE a
   709  
   710  # Timestamp array columns.
   711  
   712  statement ok
   713  CREATE TABLE a (b TIMESTAMP[])
   714  
   715  statement ok
   716  INSERT INTO a VALUES (ARRAY[now()])
   717  
   718  query I
   719  SELECT count(b) FROM a
   720  ----
   721  1
   722  
   723  statement ok
   724  DROP TABLE a
   725  
   726  # Interval array columns.
   727  
   728  statement ok
   729  CREATE TABLE a (b INTERVAL[])
   730  
   731  statement ok
   732  INSERT INTO a VALUES (ARRAY['1-2'::interval])
   733  
   734  query T
   735  SELECT b FROM a
   736  ----
   737  {"1 year 2 mons"}
   738  
   739  statement ok
   740  DROP TABLE a
   741  
   742  # UUID array columns.
   743  
   744  statement ok
   745  CREATE TABLE a (b UUID[])
   746  
   747  statement ok
   748  INSERT INTO a VALUES (ARRAY[uuid_v4()::uuid])
   749  
   750  query I
   751  SELECT count(b) FROM a
   752  ----
   753  1
   754  
   755  statement ok
   756  DROP TABLE a
   757  
   758  # OID array columns.
   759  
   760  statement ok
   761  CREATE TABLE a (b OID[])
   762  
   763  statement ok
   764  INSERT INTO a VALUES (ARRAY[1])
   765  
   766  query T
   767  SELECT b FROM a
   768  ----
   769  {1}
   770  
   771  statement ok
   772  DROP TABLE a
   773  
   774  # Collated string array columns.
   775  
   776  statement ok
   777  CREATE TABLE a (b STRING[] COLLATE en)
   778  
   779  statement ok
   780  INSERT INTO a VALUES (ARRAY['hello' COLLATE en]), (ARRAY['goodbye' COLLATE en])
   781  
   782  query T rowsort
   783  SELECT * FROM a
   784  ----
   785  {hello}
   786  {goodbye}
   787  
   788  statement error value type collatedstring{fr}\[\] doesn't match type collatedstring{en}\[\] of column "b"
   789  INSERT INTO a VALUES (ARRAY['hello' COLLATE fr])
   790  
   791  statement ok
   792  DROP TABLE a
   793  
   794  query T
   795  SELECT * FROM unnest(ARRAY['a', 'B']) ORDER BY UNNEST;
   796  ----
   797  B
   798  a
   799  
   800  query T
   801  SELECT * FROM unnest(ARRAY['a' COLLATE en, 'B' COLLATE en]) ORDER BY UNNEST;
   802  ----
   803  a
   804  B
   805  
   806  # TODO(justin): type system limitation
   807  statement error unsupported binary operator
   808  SELECT ARRAY['foo' COLLATE en] || ARRAY['bar' COLLATE en]
   809  
   810  statement error unsupported binary operator
   811  SELECT ARRAY['foo' COLLATE en] || 'bar' COLLATE en
   812  
   813  statement ok
   814  CREATE TABLE a (b STRING[])
   815  
   816  statement ok
   817  INSERT INTO a VALUES (ARRAY['foo'])
   818  
   819  statement error value type collatedstring{en}\[\] doesn't match type string\[\] of column "b"
   820  INSERT INTO a VALUES (ARRAY['foo' COLLATE en])
   821  
   822  statement ok
   823  DROP TABLE a
   824  
   825  # Array operators
   826  
   827  # Element append
   828  
   829  # Postgres also requires that the string be explicitly casted, so we're no worse
   830  # for wear despite this being a little annoying.
   831  query T
   832  SELECT ARRAY['a','b','c'] || 'd'::text
   833  ----
   834  {a,b,c,d}
   835  
   836  query error pq: could not parse "d" as type string\[\]
   837  SELECT ARRAY['a','b','c'] || 'd'
   838  
   839  query T
   840  SELECT ARRAY[1,2,3] || 4
   841  ----
   842  {1,2,3,4}
   843  
   844  query T
   845  SELECT NULL::INT[] || 4
   846  ----
   847  {4}
   848  
   849  query T
   850  SELECT 4 || NULL::INT[]
   851  ----
   852  {4}
   853  
   854  query T
   855  SELECT ARRAY[1,2,3] || NULL::INT
   856  ----
   857  {1,2,3,NULL}
   858  
   859  query T
   860  SELECT NULL::INT[] || NULL::INT
   861  ----
   862  {NULL}
   863  
   864  query T
   865  SELECT NULL::INT || ARRAY[1,2,3]
   866  ----
   867  {NULL,1,2,3}
   868  
   869  query TT
   870  SELECT NULL::INT || NULL::INT[], NULL::INT[] || NULL::INT
   871  ----
   872  {NULL} {NULL}
   873  
   874  query T
   875  SELECT 1 || ARRAY[2,3,4]
   876  ----
   877  {1,2,3,4}
   878  
   879  # This is a departure from Postgres' behavior.
   880  # In Postgres, ARRAY[1,2,3] || NULL = ARRAY[1,2,3].
   881  
   882  query T
   883  SELECT ARRAY[1,2,3] || NULL
   884  ----
   885  {1,2,3}
   886  
   887  query T
   888  SELECT NULL || ARRAY[1,2,3]
   889  ----
   890  {1,2,3}
   891  
   892  # This test is here because its typechecking is related to the above
   893  
   894  query TT
   895  SELECT NULL || 'asdf', 'asdf' || NULL
   896  ----
   897  NULL NULL
   898  
   899  statement ok
   900  CREATE TABLE a (b INT[])
   901  
   902  # Ensure arrays appended to still encode properly.
   903  
   904  statement ok
   905  INSERT INTO a VALUES (ARRAY[])
   906  
   907  statement ok
   908  UPDATE a SET b = b || 1
   909  
   910  statement ok
   911  UPDATE a SET b = b || 2
   912  
   913  statement ok
   914  UPDATE a SET b = b || 3
   915  
   916  statement ok
   917  UPDATE a SET b = b || 4
   918  
   919  query T
   920  SELECT b FROM a
   921  ----
   922  {1,2,3,4}
   923  
   924  statement ok
   925  UPDATE a SET b = NULL::INT || b || NULL::INT
   926  
   927  query T
   928  SELECT b FROM a
   929  ----
   930  {NULL,1,2,3,4,NULL}
   931  
   932  # Array append
   933  
   934  query T
   935  SELECT ARRAY[1,2,3] || ARRAY[4,5,6]
   936  ----
   937  {1,2,3,4,5,6}
   938  
   939  query T
   940  SELECT ARRAY['a','b','c'] || ARRAY['d','e','f']
   941  ----
   942  {a,b,c,d,e,f}
   943  
   944  query T
   945  SELECT ARRAY[1,2,3] || NULL::INT[]
   946  ----
   947  {1,2,3}
   948  
   949  query T
   950  SELECT NULL::INT[] || ARRAY[4,5,6]
   951  ----
   952  {4,5,6}
   953  
   954  query T
   955  SELECT NULL::INT[] || NULL::INT[]
   956  ----
   957  NULL
   958  
   959  # Array equality
   960  
   961  query B
   962  SELECT ARRAY[1,2,3] = ARRAY[1,2,3]
   963  ----
   964  true
   965  
   966  query B
   967  SELECT ARRAY[1,2,4] = ARRAY[1,2,3]
   968  ----
   969  false
   970  
   971  query B
   972  SELECT ARRAY[1,2,3] != ARRAY[1,2,3]
   973  ----
   974  false
   975  
   976  query B
   977  SELECT ARRAY[1,2,4] != ARRAY[1,2,3]
   978  ----
   979  true
   980  
   981  query B
   982  SELECT ARRAY[1,2,4] = NULL
   983  ----
   984  NULL
   985  
   986  # This behavior is surprising (one might expect that the result would be
   987  # NULL), but it's how Postgres behaves.
   988  query B
   989  SELECT ARRAY[1,2,NULL] = ARRAY[1,2,3]
   990  ----
   991  false
   992  
   993  # ARRAY_APPEND function
   994  
   995  query TT
   996  SELECT array_append(ARRAY[1,2,3], 4), array_append(ARRAY[1,2,3], NULL::INT)
   997  ----
   998  {1,2,3,4} {1,2,3,NULL}
   999  
  1000  query TT
  1001  SELECT array_append(NULL::INT[], 4), array_append(NULL::INT[], NULL::INT)
  1002  ----
  1003  {4} {NULL}
  1004  
  1005  # ARRAY_PREPEND function
  1006  
  1007  query TT
  1008  SELECT array_prepend(4, ARRAY[1,2,3]), array_prepend(NULL::INT, ARRAY[1,2,3])
  1009  ----
  1010  {4,1,2,3} {NULL,1,2,3}
  1011  
  1012  query TT
  1013  SELECT array_prepend(4, NULL::INT[]), array_prepend(NULL::INT, NULL::INT[])
  1014  ----
  1015  {4} {NULL}
  1016  
  1017  # ARRAY_CAT function
  1018  
  1019  query TT
  1020  SELECT array_cat(ARRAY[1,2,3], ARRAY[4,5,6]), array_cat(ARRAY[1,2,3], NULL::INT[])
  1021  ----
  1022  {1,2,3,4,5,6} {1,2,3}
  1023  
  1024  query TT
  1025  SELECT array_cat(NULL::INT[], ARRAY[4,5,6]), array_cat(NULL::INT[], NULL::INT[])
  1026  ----
  1027  {4,5,6} NULL
  1028  
  1029  # ARRAY_REMOVE function
  1030  
  1031  query T
  1032  SELECT array_remove(ARRAY[1,2,3,2], 2)
  1033  ----
  1034  {1,3}
  1035  
  1036  query T
  1037  SELECT array_remove(ARRAY[1,2,3,NULL::INT], NULL::INT)
  1038  ----
  1039  {1,2,3}
  1040  
  1041  query T
  1042  SELECT array_remove(NULL::INT[], NULL::INT)
  1043  ----
  1044  NULL
  1045  
  1046  # ARRAY_REPLACE function
  1047  
  1048  query T
  1049  SELECT array_replace(ARRAY[1,2,5,4], 5, 3)
  1050  ----
  1051  {1,2,3,4}
  1052  
  1053  query TT
  1054  SELECT array_replace(ARRAY[1,2,NULL,4], NULL::INT, 3), array_replace(NULL::INT[], 5, 3)
  1055  ----
  1056  {1,2,3,4} NULL
  1057  
  1058  # ARRAY_POSITION function
  1059  
  1060  query I
  1061  SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat','mon'], 'mon')
  1062  ----
  1063  2
  1064  
  1065  query I
  1066  SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat','mon'], 'abc')
  1067  ----
  1068  NULL
  1069  
  1070  query I
  1071  SELECT array_position(NULL::STRING[], 'abc')
  1072  ----
  1073  NULL
  1074  
  1075  # ARRAY_POSITIONS function
  1076  
  1077  query TT
  1078  SELECT array_positions(ARRAY['A','A','B','A'], 'A'), array_positions(ARRAY['A','A','B','A'], 'C')
  1079  ----
  1080  {1,2,4} {}
  1081  
  1082  query T
  1083  SELECT array_positions(NULL::STRING[], 'A')
  1084  ----
  1085  NULL
  1086  
  1087  query T
  1088  SELECT string_to_array('axbxc', 'x')
  1089  ----
  1090  {a,b,c}
  1091  
  1092  query T
  1093  SELECT string_to_array('~a~~b~c', '~')
  1094  ----
  1095  {"",a,"",b,c}
  1096  
  1097  query T
  1098  SELECT string_to_array('~foo~~bar~baz', '~', 'bar')
  1099  ----
  1100  {"",foo,"",NULL,baz}
  1101  
  1102  query T
  1103  SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'yy')
  1104  ----
  1105  {xx,NULL,zz}
  1106  
  1107  query T
  1108  SELECT string_to_array('foo', '')
  1109  ----
  1110  {foo}
  1111  
  1112  query T
  1113  SELECT string_to_array('', '')
  1114  ----
  1115  {}
  1116  
  1117  query T
  1118  SELECT string_to_array('', 'foo')
  1119  ----
  1120  {}
  1121  
  1122  query T
  1123  SELECT string_to_array('a', NULL)
  1124  ----
  1125  {a}
  1126  
  1127  query T
  1128  SELECT string_to_array(NULL, 'a')
  1129  ----
  1130  NULL
  1131  
  1132  query T
  1133  SELECT string_to_array(NULL, 'a', 'b')
  1134  ----
  1135  NULL
  1136  
  1137  query T
  1138  SELECT string_to_array('a', 'foo', NULL)
  1139  ----
  1140  {a}
  1141  
  1142  query T
  1143  SELECT string_to_array('foofoofoofoo', 'foo', 'foo')
  1144  ----
  1145  {"","","","",""}
  1146  
  1147  # Regression test for #23429.
  1148  
  1149  statement ok
  1150  CREATE TABLE x (a STRING[], b INT[])
  1151  
  1152  statement ok
  1153  UPDATE x SET a = ARRAY[], b = ARRAY[]
  1154  
  1155  
  1156  # Github Issue 24175: Regression test for error when using ANY with UUID array.
  1157  statement ok
  1158  CREATE TABLE documents (shared_users UUID[]);
  1159  
  1160  statement ok
  1161  INSERT INTO documents
  1162  VALUES
  1163      (ARRAY[]),
  1164      (ARRAY['3ae3560e-d771-4b63-affb-47e8d7853680'::UUID,
  1165             '6CC1B5C1-FE4F-417D-96BD-AFD1FEEEC34F'::UUID]),
  1166      (ARRAY['C6F8286C-3A41-4D7E-A4F4-3234B7A57BA9'::UUID])
  1167  
  1168  query T
  1169  SELECT *
  1170  FROM documents
  1171  WHERE '3ae3560e-d771-4b63-affb-47e8d7853680'::UUID = ANY (documents.shared_users);
  1172  ----
  1173  {3ae3560e-d771-4b63-affb-47e8d7853680,6cc1b5c1-fe4f-417d-96bd-afd1feeec34f}
  1174  
  1175  statement ok
  1176  CREATE TABLE u (x INT)
  1177  
  1178  statement ok
  1179  INSERT INTO u VALUES (1), (2)
  1180  
  1181  statement ok
  1182  CREATE TABLE v (y INT[])
  1183  
  1184  statement ok
  1185  INSERT INTO v VALUES (ARRAY[1, 2])
  1186  
  1187  # Regression test for #30191. Ensure ArrayFlatten returns correct type.
  1188  query T
  1189  SELECT * FROM v WHERE y = ARRAY(SELECT x FROM u ORDER BY x);
  1190  ----
  1191  {1,2}
  1192  
  1193  # Regression test for #34439. Ensure that empty arrays are interned correctly.
  1194  query B
  1195  SELECT ARRAY[''] = ARRAY[] FROM (VALUES (1)) WHERE ARRAY[B''] != ARRAY[]
  1196  ----
  1197  false
  1198  
  1199  subtest 36477
  1200  
  1201  statement ok
  1202  CREATE TABLE array_single_family (a INT PRIMARY KEY, b INT[], FAMILY fam0(a), FAMILY fam1(b))
  1203  
  1204  statement ok
  1205  INSERT INTO array_single_family VALUES(0,ARRAY[])
  1206  
  1207  statement ok
  1208  INSERT INTO array_single_family VALUES(1,ARRAY[1])
  1209  
  1210  statement ok
  1211  INSERT INTO array_single_family VALUES(2,ARRAY[1,2])
  1212  
  1213  statement ok
  1214  INSERT INTO array_single_family VALUES(3,ARRAY[1,2,NULL])
  1215  
  1216  statement ok
  1217  INSERT INTO array_single_family VALUES(4,ARRAY[NULL,2,3])
  1218  
  1219  statement ok
  1220  INSERT INTO array_single_family VALUES(5,ARRAY[1,NULL,3])
  1221  
  1222  statement ok
  1223  INSERT INTO array_single_family VALUES(6,ARRAY[NULL::INT])
  1224  
  1225  statement ok
  1226  INSERT INTO array_single_family VALUES(7,ARRAY[NULL::INT,NULL::INT])
  1227  
  1228  statement ok
  1229  INSERT INTO array_single_family VALUES(8,ARRAY[NULL::INT,NULL::INT,NULL::INT])
  1230  
  1231  query IT colnames
  1232  SELECT a, b FROM array_single_family ORDER BY a
  1233  ----
  1234  a  b
  1235  0  {}
  1236  1  {1}
  1237  2  {1,2}
  1238  3  {1,2,NULL}
  1239  4  {NULL,2,3}
  1240  5  {1,NULL,3}
  1241  6  {NULL}
  1242  7  {NULL,NULL}
  1243  8  {NULL,NULL,NULL}
  1244  
  1245  statement ok
  1246  DROP TABLE array_single_family
  1247  
  1248  query TT
  1249  SELECT ARRAY[]::int[], ARRAY[]:::int[]
  1250  ----
  1251  {}  {}
  1252  
  1253  subtest 37544
  1254  
  1255  query T
  1256  SELECT
  1257      col_1
  1258  FROM
  1259      (
  1260          VALUES
  1261              (ARRAY[]::INT8[]),
  1262              (ARRAY[]::INT8[])
  1263      )
  1264          AS tab_1 (col_1)
  1265  GROUP BY
  1266      tab_1.col_1
  1267  ----
  1268  {}
  1269  
  1270  # Regression test for #38293.
  1271  statement ok
  1272  CREATE TABLE defvals (
  1273      id SERIAL NOT NULL PRIMARY KEY,
  1274      arr1 STRING(100) ARRAY NOT NULL DEFAULT ARRAY[],
  1275      arr2 INT ARRAY NOT NULL DEFAULT ARRAY[]
  1276  )
  1277  
  1278  statement ok
  1279  INSERT INTO defvals(id) VALUES (1)
  1280  
  1281  statement ok
  1282  CREATE TABLE defvals2 (
  1283      id SERIAL NOT NULL PRIMARY KEY,
  1284      arr1 STRING(100) ARRAY NOT NULL DEFAULT ARRAY[NULL],
  1285      arr2 INT ARRAY NOT NULL DEFAULT ARRAY[NULL]
  1286  )
  1287  
  1288  statement ok
  1289  INSERT INTO defvals2(id) VALUES (1)
  1290  
  1291  subtest array_compare
  1292  
  1293  statement ok
  1294  DROP TABLE IF EXISTS t;
  1295  CREATE TABLE t (x INT[], y INT[], z STRING[])
  1296  
  1297  statement error pq: unsupported comparison operator: <int\[\]> < <string\[\]>
  1298  SELECT * FROM t WHERE y < z
  1299  
  1300  statement ok
  1301  INSERT INTO t VALUES (ARRAY[1], ARRAY[1, 2], NULL), (ARRAY[1, 1, 1, 1], ARRAY[2], NULL)
  1302  
  1303  query TT rowsort
  1304  SELECT x, y FROM t WHERE x < y
  1305  ----
  1306  {1}        {1,2}
  1307  {1,1,1,1}  {2}
  1308  
  1309  query TT
  1310  SELECT x, y FROM t WHERE x > y
  1311  ----
  1312  
  1313  query TT
  1314  SELECT x, y FROM t ORDER BY (x, y)
  1315  ----
  1316  {1}        {1,2}
  1317  {1,1,1,1}  {2}
  1318  
  1319  subtest array_indexes
  1320  
  1321  # Create indexes on arrays.
  1322  statement ok
  1323  DROP TABLE IF EXISTS t;
  1324  CREATE TABLE t (x INT[] PRIMARY KEY)
  1325  
  1326  statement ok
  1327  INSERT INTO t VALUES
  1328    (ARRAY[1]),
  1329    (ARRAY[5]),
  1330    (ARRAY[4]),
  1331    (ARRAY[1,4,5]),
  1332    (ARRAY[1,4,6]),
  1333    (ARRAY[1,NULL,10]),
  1334    (ARRAY[NULL]),
  1335    (ARRAY[NULL, NULL, NULL])
  1336  
  1337  # Test that the unique index rejects bad inserts.
  1338  statement error pq: duplicate key value \(x\)=\(ARRAY\[1,NULL,10\]\) violates unique constraint "primary"
  1339  INSERT INTO t VALUES (ARRAY[1, NULL, 10])
  1340  
  1341  query T
  1342  SELECT x FROM t ORDER BY x
  1343  ----
  1344  {NULL}
  1345  {NULL,NULL,NULL}
  1346  {1}
  1347  {1,NULL,10}
  1348  {1,4,5}
  1349  {1,4,6}
  1350  {4}
  1351  {5}
  1352  
  1353  # Use the index for point lookups.
  1354  query T
  1355  SELECT x FROM t WHERE x = ARRAY[1,4,6]
  1356  ----
  1357  {1,4,6}
  1358  
  1359  # Use the index for bounded scans.
  1360  # Note that nulls sort first in CockroachDB, so this ordering is different
  1361  # than what postgres will output. In postgres, NULLs in arrays are treated
  1362  # as larger than other elements, while we treat them as less.
  1363  # TODO (rohany): We have always done this for array comparisons, so I think
  1364  #  it would be a breaking change + opposite with our other null behavior to
  1365  #  change it suddenly...
  1366  query T
  1367  SELECT x FROM t WHERE x < ARRAY[1, 4, 3] ORDER BY x
  1368  ----
  1369  {NULL}
  1370  {NULL,NULL,NULL}
  1371  {1}
  1372  {1,NULL,10}
  1373  
  1374  query T
  1375  SELECT x FROM t WHERE x > ARRAY [1, NULL] ORDER BY x DESC
  1376  ----
  1377  {5}
  1378  {4}
  1379  {1,4,6}
  1380  {1,4,5}
  1381  {1,NULL,10}
  1382  
  1383  query T
  1384  SELECT x FROM t WHERE x > ARRAY[1, 3] AND x < ARRAY[1, 4, 10] ORDER BY x
  1385  ----
  1386  {1,4,5}
  1387  {1,4,6}
  1388  
  1389  query T
  1390  SELECT x FROM t WHERE x > ARRAY[NULL, NULL]:::INT[] ORDER BY x
  1391  ----
  1392  {NULL,NULL,NULL}
  1393  {1}
  1394  {1,NULL,10}
  1395  {1,4,5}
  1396  {1,4,6}
  1397  {4}
  1398  {5}
  1399  
  1400  # Test some operations on a descending index.
  1401  statement ok
  1402  CREATE INDEX i ON t(x DESC)
  1403  
  1404  query T
  1405  SELECT x FROM t@i WHERE x <= ARRAY[1] ORDER BY x DESC
  1406  ----
  1407  {1}
  1408  {NULL,NULL,NULL}
  1409  {NULL}
  1410  
  1411  query T
  1412  SELECT x FROM t@i WHERE x > ARRAY[1] ORDER BY x
  1413  ----
  1414  {1,NULL,10}
  1415  {1,4,5}
  1416  {1,4,6}
  1417  {4}
  1418  {5}
  1419  
  1420  # Ensure that we can order by the arrays without any indexes.
  1421  statement ok
  1422  DROP TABLE t;
  1423  CREATE TABLE t (x INT[]);
  1424  INSERT INTO t VALUES
  1425    (ARRAY[1]),
  1426    (ARRAY[5]),
  1427    (ARRAY[4]),
  1428    (ARRAY[1,4,5]),
  1429    (ARRAY[1,4,6]),
  1430    (ARRAY[1,NULL,10]),
  1431    (ARRAY[NULL]),
  1432    (ARRAY[NULL, NULL, NULL])
  1433  
  1434  query T
  1435  SELECT x FROM t ORDER BY x
  1436  ----
  1437  {NULL}
  1438  {NULL,NULL,NULL}
  1439  {1}
  1440  {1,NULL,10}
  1441  {1,4,5}
  1442  {1,4,6}
  1443  {4}
  1444  {5}
  1445  
  1446  query T
  1447  SELECT x FROM t ORDER BY x DESC
  1448  ----
  1449  {5}
  1450  {4}
  1451  {1,4,6}
  1452  {1,4,5}
  1453  {1,NULL,10}
  1454  {1}
  1455  {NULL,NULL,NULL}
  1456  {NULL}
  1457  
  1458  statement ok
  1459  CREATE INDEX i ON t (x);
  1460  INSERT INTO t VALUES (NULL), (NULL)
  1461  
  1462  # Test that NULL's are differentiated from {NULL}.
  1463  query T
  1464  SELECT x FROM t@i WHERE x IS NOT NULL ORDER BY x
  1465  ----
  1466  {NULL}
  1467  {NULL,NULL,NULL}
  1468  {1}
  1469  {1,NULL,10}
  1470  {1,4,5}
  1471  {1,4,6}
  1472  {4}
  1473  {5}
  1474  
  1475  # Create an indexes on a bad type.
  1476  statement error pq: unimplemented: column x is of type geography\[\] and thus is not indexable
  1477  CREATE TABLE tbad (x GEOGRAPHY[] PRIMARY KEY)
  1478  
  1479  # Test arrays of composite types.
  1480  statement ok
  1481  CREATE TABLE tarray(x DECIMAL[] PRIMARY KEY);
  1482  INSERT INTO tarray VALUES (ARRAY[1.00]), (ARRAY[1.501])
  1483  
  1484  # Ensure these are round tripped correctly.
  1485  query T
  1486  SELECT x FROM tarray ORDER BY x
  1487  ----
  1488  {1.00}
  1489  {1.501}
  1490  
  1491  # Test indexes on multiple columns with arrays.
  1492  statement ok
  1493  DROP TABLE t;
  1494  CREATE TABLE t (x INT, y INT[], z INT, INDEX i (x, y, z));
  1495  INSERT INTO t VALUES
  1496    (1, ARRAY[1, 2, 3], 3),
  1497    (NULL, ARRAY[1, NULL, 3], NULL),
  1498    (2, ARRAY[NULL, NULL, NULL], NULL),
  1499    (NULL, ARRAY[NULL, NULL], 3),
  1500    (2, ARRAY[4, 5], 7)
  1501  
  1502  query ITI
  1503  SELECT x, y, z FROM t WHERE x IS NOT NULL AND y > ARRAY[1] ORDER BY z
  1504  ----
  1505   1  {1,2,3}  3
  1506   2  {4,5}    7
  1507  
  1508  query ITI
  1509  SELECT x, y, z FROM t WHERE x = 2 AND y < ARRAY[10] ORDER BY y
  1510  ----
  1511  2  {NULL,NULL,NULL}  NULL
  1512  2  {4,5}             7
  1513  
  1514  # Test that interleaving an array index doesn't lead to problems.
  1515  statement ok
  1516  DROP TABLE IF EXISTS parent, child CASCADE;
  1517  CREATE TABLE parent (x INT, y INT[], PRIMARY KEY (x, y DESC));
  1518  CREATE TABLE child (x INT, y INT[], z INT[], PRIMARY KEY (x, y DESC, z)) INTERLEAVE IN PARENT parent (x, y);
  1519  INSERT INTO parent VALUES
  1520    (1, ARRAY[1, 2, 3]),
  1521    (1, ARRAY[1, NULL]),
  1522    (2, ARRAY[NULL]),
  1523    (3, ARRAY[NULL, 1, NULL]);
  1524  INSERT INTO child VALUES
  1525    (1, ARRAY[1, 2, 3], ARRAY[4]),
  1526    (1, ARRAY[1, 2, 3, 4], ARRAY[5]),
  1527    (1, ARRAY[1, NULL], ARRAY[5]),
  1528    (1, ARRAY[1, NULL, NULL], ARRAY[10]),
  1529    (2, ARRAY[NULL], ARRAY[1]),
  1530    (3, ARRAY[NULL, 1, NULL], ARRAY[3]);
  1531  
  1532  # Ensure scans on the parent and child aren't affected.
  1533  query IT
  1534  SELECT x, y FROM parent ORDER BY x, y DESC
  1535  ----
  1536  1  {1,2,3}
  1537  1  {1,NULL}
  1538  2  {NULL}
  1539  3  {NULL,1,NULL}
  1540  
  1541  query ITT
  1542  SELECT x, y, z FROM child ORDER BY x, y DESC, z
  1543  ----
  1544  1  {1,2,3,4}      {5}
  1545  1  {1,2,3}        {4}
  1546  1  {1,NULL,NULL}  {10}
  1547  1  {1,NULL}       {5}
  1548  2  {NULL}         {1}
  1549  3  {NULL,1,NULL}  {3}
  1550  
  1551  # Test arrays of strings.
  1552  statement ok
  1553  DROP TABLE t;
  1554  CREATE TABLE t (x STRING[] PRIMARY KEY);
  1555  INSERT INTO t VALUES
  1556    (ARRAY['']),
  1557    (ARRAY['hello', 'hi\nthere']),
  1558    (ARRAY['another', 'string', 'in', 'my', 'array']),
  1559    (ARRAY['this', 'array', NULL, 'has', NULL])
  1560  
  1561  query T
  1562  SELECT x FROM t ORDER BY x DESC
  1563  ----
  1564  {this,array,NULL,has,NULL}
  1565  {hello,"hi\\nthere"}
  1566  {another,string,in,my,array}
  1567  {""}
  1568  
  1569  query T
  1570  SELECT x FROM t WHERE x > ARRAY['hell'] AND x < ARRAY['i']
  1571  ----
  1572  {hello,"hi\\nthere"}
  1573  
  1574  # Test arrays of bytes, and insert some bytes that are used by the
  1575  # array encoding itself.
  1576  statement ok
  1577  DROP TABLE t;
  1578  CREATE TABLE t (x BYTES[] PRIMARY KEY);
  1579  INSERT INTO t VALUES
  1580    (ARRAY[b'\xFF', b'\x00']),
  1581    (ARRAY[NULL, b'\x01', b'\x01', NULL]),
  1582    (ARRAY[NULL, b'\xFF'])
  1583  
  1584  query T
  1585  SELECT x FROM t ORDER BY x
  1586  ----
  1587  {NULL,"\\x01","\\x01",NULL}
  1588  {NULL,"\\xff"}
  1589  {"\\xff","\\x00"}
  1590  
  1591  # Repeat the above test with a descending encoding.
  1592  statement ok
  1593  DROP TABLE t;
  1594  CREATE TABLE t (x BYTES[], PRIMARY KEY (x DESC));
  1595  INSERT INTO t VALUES
  1596    (ARRAY[b'\xFF', b'\x00']),
  1597    (ARRAY[NULL, b'\x01', b'\x01', NULL]),
  1598    (ARRAY[NULL, b'\xFF'])
  1599  
  1600  query T
  1601  SELECT x FROM t ORDER BY x
  1602  ----
  1603  {NULL,"\\x01","\\x01",NULL}
  1604  {NULL,"\\xff"}
  1605  {"\\xff","\\x00"}
  1606  
  1607  # Test some indexes with multiple array columns.
  1608  statement ok
  1609  DROP TABLE t;
  1610  CREATE TABLE t (x INT[], y INT[], PRIMARY KEY (x, y));
  1611  INSERT INTO t VALUES
  1612    (ARRAY[1, 2], ARRAY[3, 4]),
  1613    (ARRAY[NULL, NULL], ARRAY[NULL, NULL]),
  1614    (ARRAY[], ARRAY[]),
  1615    (ARRAY[], ARRAY[NULL, 2]),
  1616    (ARRAY[NULL], ARRAY[])
  1617  
  1618  query TT
  1619  SELECT x, y FROM t ORDER BY x, y
  1620  ----
  1621  {}           {}
  1622  {}           {NULL,2}
  1623  {NULL}       {}
  1624  {NULL,NULL}  {NULL,NULL}
  1625  {1,2}        {3,4}
  1626  
  1627  query TT
  1628  SELECT x, y FROM t WHERE x > ARRAY[NULL]:::INT[] ORDER BY y
  1629  ----
  1630  {NULL,NULL}  {NULL,NULL}
  1631  {1,2}        {3,4}
  1632  
  1633  # Test that we can create foreign key references on arrays.
  1634  statement ok
  1635  DROP TABLE IF EXISTS t1, t2 CASCADE;
  1636  CREATE TABLE t1 (x INT[] PRIMARY KEY);
  1637  CREATE TABLE t2 (x INT[] PRIMARY KEY);
  1638  ALTER TABLE t2 ADD FOREIGN KEY (x) REFERENCES t1 (x)
  1639  
  1640  statement ok
  1641  INSERT INTO t1 VALUES (ARRAY[1, 2, NULL, 3])
  1642  
  1643  statement error pq: insert on table "t2" violates foreign key constraint "fk_x_ref_t1"
  1644  INSERT INTO t2 VALUES (ARRAY[1, 2])
  1645  
  1646  statement ok
  1647  INSERT INTO t2 VALUES (ARRAY[1, 2, NULL, 3])
  1648  
  1649  statement error pq: delete on table "t1" violates foreign key constraint "fk_x_ref_t1" on table "t2"
  1650  DELETE FROM t1 WHERE x > ARRAY[1]
  1651  
  1652  # Test different joins on indexed arrays.
  1653  statement ok
  1654  DROP TABLE IF EXISTS t1, t2 CASCADE;
  1655  CREATE TABLE t1 (x INT[] PRIMARY KEY);
  1656  CREATE TABLE t2 (x INT[] PRIMARY KEY);
  1657  INSERT INTO t1 VALUES
  1658    (ARRAY[1, 2]),
  1659    (ARRAY[NULL]),
  1660    (ARRAY[3, 4]);
  1661  INSERT INTO t2 VALUES
  1662    (ARRAY[]),
  1663    (ARRAY[1, 2]),
  1664    (ARRAY[NULL])
  1665  
  1666  query T rowsort
  1667  SELECT t1.x FROM t1 INNER HASH JOIN t2 ON t1.x = t2.x
  1668  ----
  1669  {NULL}
  1670  {1,2}
  1671  
  1672  query T rowsort
  1673  SELECT t1.x FROM t1 INNER MERGE JOIN t2 ON t1.x = t2.x
  1674  ----
  1675  {NULL}
  1676  {1,2}
  1677  
  1678  query T rowsort
  1679  SELECT t1.x FROM t1 INNER LOOKUP JOIN t2 ON t1.x = t2.x
  1680  ----
  1681  {NULL}
  1682  {1,2}
  1683  
  1684  # Test that we can group by arrays.
  1685  statement ok
  1686  DROP TABLE t;
  1687  CREATE TABLE t (x INT[], INDEX (x));
  1688  INSERT INTO t VALUES
  1689    (ARRAY[1, 2]),
  1690    (ARRAY[1, 2]),
  1691    (ARRAY[1, 2]),
  1692    (ARRAY[NULL, NULL]),
  1693    (ARRAY[NULL, NULL]),
  1694    (ARRAY[1,2,NULL,4,NULL]),
  1695    (ARRAY[1,2,NULL,4,NULL])
  1696  
  1697  query T rowsort
  1698  SELECT x FROM t GROUP BY x
  1699  ----
  1700  {1,2}
  1701  {NULL,NULL}
  1702  {1,2,NULL,4,NULL}