@@ -35,3 +35,189 @@ SELECT arrays_overlap(array(1, 2, 3), b) FROM test_arrays_overlap
3535-- literal + literal
3636query
3737SELECT arrays_overlap(array(1 , 2 , 3 ), array(3 , 4 , 5 )), arrays_overlap(array(1 , 2 ), array(3 , 4 )), arrays_overlap(array(), array(1 )), arrays_overlap(cast(NULL as array< int > ), array(1 ))
38+
39+ -- NULL element semantics (three-valued logic)
40+ -- When no match is found but NULL elements exist, result should be NULL (uncertain)
41+ statement
42+ CREATE TABLE test_overlap_nulls (a array< int > , b array< int > ) USING parquet
43+
44+ statement
45+ INSERT INTO test_overlap_nulls VALUES (array(1 , NULL , 3 ), array(4 , 5 )), (array(1 , NULL , 3 ), array(1 , 5 )), (array(1 , NULL ), array(NULL , 2 )), (array(NULL ), array(NULL )), (array(NULL , NULL ), array(NULL , NULL )), (array(1 , NULL ), array(2 , NULL )), (array(NULL , 2 ), array(1 , NULL ))
46+
47+ -- no match + has NULL => NULL
48+ query
49+ SELECT arrays_overlap(a, b) FROM test_overlap_nulls WHERE a = array(1 , NULL , 3 ) AND b = array(4 , 5 )
50+
51+ -- has match + has NULL => true (match found, NULL irrelevant)
52+ query
53+ SELECT arrays_overlap(a, b) FROM test_overlap_nulls WHERE a = array(1 , NULL , 3 ) AND b = array(1 , 5 )
54+
55+ -- NULL vs NULL elements => NULL (NULL != NULL)
56+ query
57+ SELECT arrays_overlap(a, b) FROM test_overlap_nulls WHERE a = array(NULL ) AND b = array(NULL )
58+
59+ -- all rows
60+ query
61+ SELECT a, b, arrays_overlap(a, b) FROM test_overlap_nulls
62+
63+ -- empty array combinations
64+ query
65+ SELECT arrays_overlap(array(), array()) FROM test_overlap_nulls
66+
67+ query
68+ SELECT arrays_overlap(array(), array(1 , 2 )) FROM test_overlap_nulls
69+
70+ query
71+ SELECT arrays_overlap(array(1 , 2 ), array()) FROM test_overlap_nulls
72+
73+ query
74+ SELECT arrays_overlap(array(), array(NULL )) FROM test_overlap_nulls
75+
76+ -- both-NULL arrays
77+ query
78+ SELECT arrays_overlap(cast(NULL as array< int > ), cast(NULL as array< int > )) FROM test_overlap_nulls
79+
80+ -- identical arrays
81+ query
82+ SELECT arrays_overlap(a, a) FROM test_overlap_nulls
83+
84+ -- duplicate elements in arrays
85+ statement
86+ CREATE TABLE test_overlap_dups (a array< int > , b array< int > ) USING parquet
87+
88+ statement
89+ INSERT INTO test_overlap_dups VALUES (array(1 , 1 , 1 ), array(2 , 2 , 2 )), (array(1 , 1 , 1 ), array(1 , 2 , 2 )), (array(1 , 2 , 1 , 2 ), array(3 , 4 , 3 , 4 )), (array(1 , 2 , 1 , 2 ), array(2 , 3 , 2 , 3 ))
90+
91+ query
92+ SELECT a, b, arrays_overlap(a, b) FROM test_overlap_dups
93+
94+ -- single element arrays
95+ query
96+ SELECT arrays_overlap(array(1 ), array(1 )) FROM test_overlap_dups
97+
98+ query
99+ SELECT arrays_overlap(array(1 ), array(2 )) FROM test_overlap_dups
100+
101+ -- string arrays
102+ statement
103+ CREATE TABLE test_overlap_str (a array< string> , b array< string> ) USING parquet
104+
105+ statement
106+ INSERT INTO test_overlap_str VALUES (array(' a' , ' b' , ' c' ), array(' c' , ' d' )), (array(' a' , ' b' ), array(' c' , ' d' )), (array(' a' , NULL ), array(' b' , NULL )), (array(' a' , NULL ), array(' a' , ' b' )), (NULL , array(' a' )), (array(' ' ), array(' ' )), (array(' ' , NULL ), array(' x' ))
107+
108+ query
109+ SELECT a, b, arrays_overlap(a, b) FROM test_overlap_str
110+
111+ -- empty string vs NULL
112+ query
113+ SELECT arrays_overlap(array(' ' , ' a' ), array(' ' )) FROM test_overlap_str
114+
115+ -- double arrays with special values
116+ statement
117+ CREATE TABLE test_overlap_dbl (a array< double> , b array< double> ) USING parquet
118+
119+ statement
120+ INSERT INTO test_overlap_dbl VALUES (array(1 .0 , 2 .0 ), array(2 .0 , 3 .0 )), (array(1 .0 , double(' NaN' )), array(double(' NaN' ), 2 .0 )), (array(double(' Infinity' ), 1 .0 ), array(double(' Infinity' ))), (array(double(' -Infinity' )), array(double(' Infinity' ))), (array(0 .0 ), array(- 0 .0 )), (array(1 .0 , NULL ), array(2 .0 , NULL ))
121+
122+ query
123+ SELECT a, b, arrays_overlap(a, b) FROM test_overlap_dbl
124+
125+ -- boolean arrays
126+ query
127+ SELECT arrays_overlap(array(true, false), array(false)) FROM test_overlap_dbl
128+
129+ query
130+ SELECT arrays_overlap(array(true), array(false)) FROM test_overlap_dbl
131+
132+ query
133+ SELECT arrays_overlap(array(true, NULL ), array(false)) FROM test_overlap_dbl
134+
135+ -- bigint arrays
136+ statement
137+ CREATE TABLE test_overlap_long (a array< bigint > , b array< bigint > ) USING parquet
138+
139+ statement
140+ INSERT INTO test_overlap_long VALUES (array(9223372036854775807 , 1 ), array(9223372036854775807 )), (array(- 9223372036854775808 ), array(- 9223372036854775808 )), (array(0 ), array(1 ))
141+
142+ query
143+ SELECT a, b, arrays_overlap(a, b) FROM test_overlap_long
144+
145+ -- decimal arrays
146+ statement
147+ CREATE TABLE test_overlap_dec (a array< decimal (10 ,2 )> , b array< decimal (10 ,2 )> ) USING parquet
148+
149+ statement
150+ INSERT INTO test_overlap_dec VALUES (array(1 .00 , 2 .50 ), array(2 .50 , 3 .00 )), (array(1 .00 , 2 .00 ), array(3 .00 , 4 .00 )), (array(1 .10 , NULL ), array(2 .20 , NULL ))
151+
152+ query
153+ SELECT a, b, arrays_overlap(a, b) FROM test_overlap_dec
154+
155+ -- date arrays
156+ statement
157+ CREATE TABLE test_overlap_date (a array< date > , b array< date > ) USING parquet
158+
159+ statement
160+ INSERT INTO test_overlap_date VALUES (array(date ' 2024-01-01' , date ' 2024-06-15' ), array(date ' 2024-06-15' , date ' 2024-12-31' )), (array(date ' 2024-01-01' ), array(date ' 2024-12-31' )), (array(date ' 2024-01-01' , NULL ), array(date ' 2024-12-31' ))
161+
162+ query
163+ SELECT a, b, arrays_overlap(a, b) FROM test_overlap_date
164+
165+ -- timestamp arrays
166+ statement
167+ CREATE TABLE test_overlap_ts (a array< timestamp > , b array< timestamp > ) USING parquet
168+
169+ statement
170+ INSERT INTO test_overlap_ts VALUES (array(timestamp ' 2024-01-01 00:00:00' , timestamp ' 2024-06-15 12:00:00' ), array(timestamp ' 2024-06-15 12:00:00' )), (array(timestamp ' 2024-01-01 00:00:00' ), array(timestamp ' 2024-12-31 23:59:59' ))
171+
172+ query
173+ SELECT a, b, arrays_overlap(a, b) FROM test_overlap_ts
174+
175+ -- large arrays
176+ statement
177+ CREATE TABLE test_overlap_large (id int ) USING parquet
178+
179+ statement
180+ INSERT INTO test_overlap_large VALUES (1 )
181+
182+ -- large array with single overlap at end
183+ query
184+ SELECT arrays_overlap(sequence(1 , 100 ), sequence(100 , 200 )) FROM test_overlap_large
185+
186+ -- large array with no overlap
187+ query
188+ SELECT arrays_overlap(sequence(1 , 100 ), sequence(101 , 200 )) FROM test_overlap_large
189+
190+ -- large array self-overlap
191+ query
192+ SELECT arrays_overlap(sequence(1 , 1000 ), sequence(1 , 1000 )) FROM test_overlap_large
193+
194+ -- nested arrays
195+ statement
196+ CREATE TABLE test_overlap_nested (a array< array< int >> , b array< array< int >> ) USING parquet
197+
198+ statement
199+ INSERT INTO test_overlap_nested VALUES (array(array(1 , 2 ), array(3 , 4 )), array(array(3 , 4 ), array(5 , 6 ))), (array(array(1 , 2 )), array(array(3 , 4 ))), (array(array(1 , 2 ), cast(NULL as array< int > )), array(array(3 , 4 ))), (array(array(1 , NULL )), array(array(1 , NULL ))), (array(cast(NULL as array< int > )), array(cast(NULL as array< int > )))
200+
201+ query
202+ SELECT a, b, arrays_overlap(a, b) FROM test_overlap_nested
203+
204+ -- struct element arrays
205+ statement
206+ CREATE TABLE test_overlap_struct (a array< struct< x:int , y:int >> , b array< struct< x:int , y:int >> ) USING parquet
207+
208+ statement
209+ INSERT INTO test_overlap_struct VALUES (array(named_struct(' x' , 1 , ' y' , 2 )), array(named_struct(' x' , 1 , ' y' , 2 ))), (array(named_struct(' x' , 1 , ' y' , 2 )), array(named_struct(' x' , 3 , ' y' , 4 ))), (array(named_struct(' x' , 1 , ' y' , cast(NULL as int ))), array(named_struct(' x' , 1 , ' y' , cast(NULL as int )))), (array(cast(NULL as struct< x:int , y:int > )), array(cast(NULL as struct< x:int , y:int > )))
210+
211+ query
212+ SELECT a, b, arrays_overlap(a, b) FROM test_overlap_struct
213+
214+ -- mixed column and literal with NULL elements
215+ query
216+ SELECT arrays_overlap(a, array(99 , NULL )) FROM test_arrays_overlap
217+
218+ query
219+ SELECT arrays_overlap(array(NULL , 99 ), b) FROM test_arrays_overlap
220+
221+ -- conditional (CASE WHEN) arrays
222+ query
223+ SELECT arrays_overlap(CASE WHEN a IS NOT NULL THEN a ELSE array(0 ) END, b) FROM test_arrays_overlap
0 commit comments