000001 000002 # EVIDENCE-OF: R-52275-55503 When the right operand is an empty set, the 000003 # result of IN is false and the result of NOT IN is true, regardless of 000004 # the left operand and even if the left operand is NULL. 000005 # 000006 000007 # EVIDENCE-OF: R-64309-54027 Note that SQLite allows the parenthesized 000008 # list of scalar values on the right-hand side of an IN or NOT IN 000009 # operator to be an empty list but most other SQL database engines and 000010 # the SQL92 standard require the list to contain at least one element. 000011 # 000012 000013 000014 # EVIDENCE-OF: R-50221-42915 The result of an IN or NOT IN operator is 000015 # determined by the following matrix: Left operand is NULL Right operand 000016 # contains NULL Right operand is an empty set Left operand found within 000017 # right operand Result of IN operator Result of NOT IN operator no no no 000018 # no false true does not matter no yes no false true no does not matter 000019 # no yes true false no yes no no NULL NULL yes does not matter no does 000020 # not matter NULL NULL 000021 # 000022 000023 skipif oracle 000024 statement ok 000025 CREATE TABLE t1( x INTEGER, y TEXT ) 000026 000027 onlyif oracle 000028 statement ok 000029 CREATE TABLE t1( x INTEGER, y VARCHAR(8) ) 000030 000031 statement ok 000032 INSERT INTO t1 VALUES(1,'true') 000033 000034 statement ok 000035 INSERT INTO t1 VALUES(0,'false') 000036 000037 statement ok 000038 INSERT INTO t1 VALUES(NULL,'NULL') 000039 000040 # Row 1: 000041 000042 query I nosort 000043 SELECT 1 FROM t1 WHERE 1 IN (2) 000044 ---- 000045 000046 query I nosort 000047 SELECT 1 FROM t1 WHERE 1.0 IN (2.0) 000048 ---- 000049 000050 query I nosort 000051 SELECT 1 FROM t1 WHERE '1' IN ('2') 000052 ---- 000053 000054 query I nosort 000055 SELECT 1 FROM t1 WHERE 1 NOT IN (2) 000056 ---- 000057 1 000058 1 000059 1 000060 000061 query I nosort 000062 SELECT 1 FROM t1 WHERE 1.0 NOT IN (2.0) 000063 ---- 000064 1 000065 1 000066 1 000067 000068 query I nosort 000069 SELECT 1 FROM t1 WHERE '1' NOT IN ('2') 000070 ---- 000071 1 000072 1 000073 1 000074 000075 # 000076 # Row 2: empty RHS 000077 000078 skipif mysql # empty RHS 000079 skipif mssql # empty RHS 000080 skipif oracle # empty RHS 000081 query I nosort 000082 SELECT 1 FROM t1 WHERE 1 IN () 000083 ---- 000084 000085 skipif mysql # empty RHS 000086 skipif mssql # empty RHS 000087 skipif oracle # empty RHS 000088 query I nosort 000089 SELECT 1 FROM t1 WHERE 1.0 IN () 000090 ---- 000091 000092 skipif mysql # empty RHS 000093 skipif mssql # empty RHS 000094 skipif oracle # empty RHS 000095 query I nosort 000096 SELECT 1 FROM t1 WHERE '1' IN () 000097 ---- 000098 000099 skipif mysql # empty RHS 000100 skipif mssql # empty RHS 000101 skipif oracle # empty RHS 000102 query I nosort 000103 SELECT 1 FROM t1 WHERE NULL IN () 000104 ---- 000105 000106 skipif mysql # empty RHS 000107 skipif mssql # empty RHS 000108 skipif oracle # empty RHS 000109 query I nosort 000110 SELECT 1 FROM t1 WHERE 1 NOT IN () 000111 ---- 000112 1 000113 1 000114 1 000115 000116 skipif mysql # empty RHS 000117 skipif mssql # empty RHS 000118 skipif oracle # empty RHS 000119 query I nosort 000120 SELECT 1 FROM t1 WHERE 1.0 NOT IN () 000121 ---- 000122 1 000123 1 000124 1 000125 000126 skipif mysql # empty RHS 000127 skipif mssql # empty RHS 000128 skipif oracle # empty RHS 000129 query I nosort 000130 SELECT 1 FROM t1 WHERE '1' NOT IN () 000131 ---- 000132 1 000133 1 000134 1 000135 000136 skipif mysql # empty RHS 000137 skipif mssql # empty RHS 000138 skipif oracle # empty RHS 000139 query I nosort 000140 SELECT 1 FROM t1 WHERE NULL NOT IN () 000141 ---- 000142 1 000143 1 000144 1 000145 000146 # Row 3: 000147 000148 query I nosort 000149 SELECT 1 FROM t1 WHERE 1 IN ( NULL, 1 ) 000150 ---- 000151 1 000152 1 000153 1 000154 000155 query I nosort 000156 SELECT 1 FROM t1 WHERE 1.0 IN ( NULL, 1.0 ) 000157 ---- 000158 1 000159 1 000160 1 000161 000162 query I nosort 000163 SELECT 1 FROM t1 WHERE '1' IN ( NULL, '1' ) 000164 ---- 000165 1 000166 1 000167 1 000168 000169 query I nosort 000170 SELECT 1 FROM t1 WHERE 1 NOT IN ( NULL, 1 ) 000171 ---- 000172 000173 query I nosort 000174 SELECT 1 FROM t1 WHERE 1.0 NOT IN ( NULL, 1.0 ) 000175 ---- 000176 000177 query I nosort 000178 SELECT 1 FROM t1 WHERE '1' NOT IN ( NULL, '1' ) 000179 ---- 000180 000181 query I nosort 000182 SELECT 1 FROM t1 WHERE 1 IN ( 1 ) 000183 ---- 000184 1 000185 1 000186 1 000187 000188 query I nosort 000189 SELECT 1 FROM t1 WHERE 1.0 IN ( 1.0 ) 000190 ---- 000191 1 000192 1 000193 1 000194 000195 query I nosort 000196 SELECT 1 FROM t1 WHERE '1' IN ( '1' ) 000197 ---- 000198 1 000199 1 000200 1 000201 000202 query I nosort 000203 SELECT 1 FROM t1 WHERE 1 NOT IN ( 1 ) 000204 ---- 000205 000206 query I nosort 000207 SELECT 1 FROM t1 WHERE 1.0 NOT IN ( 1.0 ) 000208 ---- 000209 000210 query I nosort 000211 SELECT 1 FROM t1 WHERE '1' NOT IN ( '1' ) 000212 ---- 000213 000214 # 000215 # Row 4: RHS contains NULL, LHS not in RHS 000216 000217 query I nosort 000218 SELECT 1 FROM t1 WHERE 1 IN ( NULL, 2 ) 000219 ---- 000220 000221 query I nosort 000222 SELECT 1 FROM t1 WHERE 1.0 IN ( NULL, 2.0 ) 000223 ---- 000224 000225 query I nosort 000226 SELECT 1 FROM t1 WHERE '1' IN ( NULL, '2' ) 000227 ---- 000228 000229 query I nosort 000230 SELECT 1 FROM t1 WHERE 1 NOT IN ( NULL, 2 ) 000231 ---- 000232 000233 query I nosort 000234 SELECT 1 FROM t1 WHERE 1.0 NOT IN ( NULL, 2.0 ) 000235 ---- 000236 000237 query I nosort 000238 SELECT 1 FROM t1 WHERE '1' NOT IN ( NULL, '2' ) 000239 ---- 000240 000241 # 000242 # Row 5: LHS is NULL 000243 000244 query I nosort 000245 SELECT 1 FROM t1 WHERE NULL IN ( 1 ) 000246 ---- 000247 000248 query I nosort 000249 SELECT 1 FROM t1 WHERE NULL IN ( 1.0 ) 000250 ---- 000251 000252 query I nosort 000253 SELECT 1 FROM t1 WHERE NULL IN ( '1' ) 000254 ---- 000255 000256 query I nosort 000257 SELECT 1 FROM t1 WHERE NULL NOT IN ( 1 ) 000258 ---- 000259 000260 query I nosort 000261 SELECT 1 FROM t1 WHERE NULL NOT IN ( 1.0 ) 000262 ---- 000263 000264 query I nosort 000265 SELECT 1 FROM t1 WHERE NULL NOT IN ( '1' ) 000266 ---- 000267 000268 query I nosort 000269 SELECT 1 FROM t1 WHERE NULL IN ( NULL, 1 ) 000270 ---- 000271 000272 query I nosort 000273 SELECT 1 FROM t1 WHERE NULL IN ( NULL, 1.0 ) 000274 ---- 000275 000276 query I nosort 000277 SELECT 1 FROM t1 WHERE NULL IN ( NULL, '1' ) 000278 ---- 000279 000280 query I nosort 000281 SELECT 1 FROM t1 WHERE NULL NOT IN ( NULL, 1 ) 000282 ---- 000283 000284 query I nosort 000285 SELECT 1 FROM t1 WHERE NULL NOT IN ( NULL, 1.0 ) 000286 ---- 000287 000288 query I nosort 000289 SELECT 1 FROM t1 WHERE NULL NOT IN ( NULL, '1' ) 000290 ---- 000291 000292 # EVIDENCE-OF: R-35033-20570 The subquery on the right of an IN or NOT 000293 # IN operator must be a scalar subquery if the left expression is not a 000294 # row value expression. 000295 000296 query I nosort 000297 SELECT 1 FROM t1 WHERE 1 IN (SELECT 1) 000298 ---- 000299 1 000300 1 000301 1 000302 000303 statement error 000304 SELECT 1 FROM t1 WHERE 1 IN (SELECT 1,2) 000305 000306 statement error 000307 SELECT 1 FROM t1 WHERE 1 IN (SELECT x,y FROM t1) 000308 000309 statement error 000310 SELECT 1 FROM t1 WHERE 1 IN (SELECT * FROM t1) 000311 000312 statement error 000313 SELECT 1 FROM t1 WHERE 1 IN (SELECT min(x),max(x) FROM t1)