github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/sql/logictest/testdata/logic_test/apply_join (about) 1 statement ok 2 CREATE TABLE t (k INT PRIMARY KEY, str STRING); 3 CREATE TABLE u (l INT PRIMARY KEY, str2 STRING); 4 CREATE TABLE v (m INT PRIMARY KEY, str3 STRING); 5 INSERT INTO t SELECT i, to_english(i) FROM generate_series(1, 5) AS g(i); 6 INSERT INTO u SELECT i, to_english(i) FROM generate_series(1, 5) AS g(i); 7 INSERT INTO v SELECT i, to_english(i) FROM generate_series(1, 5) AS g(i); 8 9 statement ok 10 SET allow_prepare_as_opt_plan = ON 11 12 # InnerJoinApply tests. 13 14 statement ok 15 PREPARE a AS OPT PLAN ' 16 (Root 17 (InnerJoinApply 18 (Scan [(Table "t") (Cols "k,str") ]) 19 (Select 20 (Scan [(Table "u") (Cols "l,str2") ]) 21 [ (Eq (Var "k") (Var "l") )] 22 ) 23 [] 24 [] 25 ) 26 (Presentation "k,str,l,str2") 27 (NoOrdering) 28 )' 29 30 query ITIT rowsort 31 EXECUTE a 32 ---- 33 1 one 1 one 34 2 two 2 two 35 3 three 3 three 36 4 four 4 four 37 5 five 5 five 38 39 # LeftJoinApply tests. 40 41 statement ok 42 PREPARE b AS OPT PLAN ' 43 (Root 44 (LeftJoinApply 45 (Scan [(Table "t") (Cols "k,str") ]) 46 (Select 47 (Scan [(Table "u") (Cols "l,str2") ]) 48 [ (Eq (Plus (Var "k") (Const 1 "int")) (Var "l") )] 49 ) 50 [] 51 [] 52 ) 53 (Presentation "k,str,l,str2") 54 (NoOrdering) 55 )' 56 57 query ITIT rowsort 58 EXECUTE b 59 ---- 60 1 one 2 two 61 2 two 3 three 62 3 three 4 four 63 4 four 5 five 64 5 five NULL NULL 65 66 # SemiJoinApply tests. 67 68 statement ok 69 PREPARE c AS OPT PLAN ' 70 (Root 71 (SemiJoinApply 72 (Scan [(Table "t") (Cols "k,str") ]) 73 (Select 74 (Scan [(Table "u") (Cols "l,str2") ]) 75 [ (Eq (Plus (Var "k") (Const 1 "int")) (Var "l") )] 76 ) 77 [] 78 [] 79 ) 80 (Presentation "k,str") 81 (NoOrdering) 82 )' 83 84 query IT rowsort 85 EXECUTE c 86 ---- 87 1 one 88 2 two 89 3 three 90 4 four 91 92 # AntiJoinApply tests. 93 94 statement ok 95 PREPARE d AS OPT PLAN ' 96 (Root 97 (AntiJoinApply 98 (Scan [(Table "t") (Cols "k,str") ]) 99 (Select 100 (Scan [(Table "u") (Cols "l,str2") ]) 101 [ (Eq (Plus (Var "k") (Const 1 "int")) (Var "l") )] 102 ) 103 [] 104 [] 105 ) 106 (Presentation "k,str") 107 (NoOrdering) 108 )' 109 110 query IT rowsort 111 EXECUTE d 112 ---- 113 5 five 114 115 # Nested Apply, with outer columns of the outer apply on the left and right of 116 # the inner apply. 117 118 statement ok 119 PREPARE e AS OPT PLAN ' 120 (Root 121 (InnerJoinApply 122 (Scan [(Table "t") (Cols "k,str") ]) 123 (InnerJoinApply 124 (Select 125 (Scan [(Table "u") (Cols "l,str2") ]) 126 [ (Eq (Var "k") (Var "l") )] 127 ) 128 (Select 129 (Scan [(Table "v") (Cols "m,str3") ]) 130 [ (Eq (Var "k") (Var "m") )] 131 ) 132 [ (Eq (Var "k") (Var "l")) ] 133 [] 134 ) 135 [] 136 [] 137 ) 138 (Presentation "k,str,l,str2,m,str3") 139 (NoOrdering) 140 )' 141 142 query ITITIT rowsort 143 EXECUTE e 144 ---- 145 1 one 1 one 1 one 146 2 two 2 two 2 two 147 3 three 3 three 3 three 148 4 four 4 four 4 four 149 5 five 5 five 5 five 150 151 # Test subqueries within an apply join. 152 153 statement ok 154 PREPARE f AS OPT PLAN ' 155 (Root 156 (InnerJoinApply 157 (Scan [(Table "t") (Cols "k,str") ]) 158 (Select 159 (Scan [(Table "u") (Cols "l,str2") ]) 160 [ (Eq (Plus (Var "k") 161 (Subquery (Values [(Tuple [(Const 1 "int")] "tuple{int}") ] 162 [(Cols [(NewColumn "z" "int")] )]) 163 [])) 164 (Var "l") )] 165 ) 166 [] 167 [] 168 ) 169 (Presentation "k,str,l,str2") 170 (NoOrdering) 171 )' 172 173 query ITIT rowsort 174 EXECUTE f 175 ---- 176 1 one 2 two 177 2 two 3 three 178 3 three 4 four 179 4 four 5 five 180 181 # Another test of subqueries within an apply join. 182 183 query I 184 SELECT 185 (SELECT * FROM (VALUES ((SELECT x FROM (VALUES (1)) AS s (x)) + y))) 186 FROM 187 (VALUES (1), (2), (3)) AS t (y) 188 ---- 189 2 190 3 191 4 192 193 194 # Regression test for #36197: 0-col applyjoin RHS doesn't panic 195 196 statement ok 197 CREATE TABLE table9 ( 198 _bool BOOL, 199 _bytes BYTES, 200 _date DATE, 201 _decimal DECIMAL, 202 _float4 FLOAT4, 203 _float8 FLOAT8, 204 _inet INET, 205 _int4 INT4, 206 _int8 INT8, 207 _interval INTERVAL, 208 _jsonb JSONB, 209 _string STRING, 210 _time TIME, 211 _timestamp TIMESTAMP, 212 _timestamptz TIMESTAMPTZ, 213 _uuid UUID 214 ); INSERT INTO table9 DEFAULT VALUES; 215 216 query B 217 SELECT 218 true 219 FROM 220 table9 AS tab_27927 221 WHERE 222 EXISTS( 223 SELECT 224 tab_27929._string AS col_85223 225 FROM 226 table9 AS tab_27928, 227 table9 AS tab_27929, 228 table9 AS tab_27930 229 RIGHT JOIN table9 AS tab_27931 230 ON 231 NOT 232 ( 233 tab_27927._float8 234 IN ( 235 CASE 236 WHEN NULL 237 THEN div( 238 tab_27927._float4::FLOAT8, 239 tab_27927._float4::FLOAT8 240 )::FLOAT8 241 ELSE tab_27927._float4 242 END, 243 tab_27927._float4, 244 tab_27927._float8::FLOAT8 245 + NULL::FLOAT8, 246 tab_27927._float4 247 ) 248 ) 249 WHERE 250 EXISTS( 251 SELECT 252 2470039497:::OID AS col_85224 253 FROM 254 table9 AS tab_27932 255 ORDER BY 256 tab_27932._string ASC, 257 tab_27932._interval DESC, 258 tab_27932._uuid DESC 259 LIMIT 260 37:::INT8 261 ) 262 LIMIT 263 11:::INT8 264 ) 265 LIMIT 266 89:::INT8; 267 ---- 268 true 269 270 # Regression test for #37454: untyped null produced at top level. 271 272 statement ok 273 CREATE TABLE x (a INT8); CREATE TABLE y (b INT8); INSERT INTO x VALUES (1); INSERT INTO y VALUES (2); 274 275 query II 276 SELECT a, (SELECT a FROM y) FROM x 277 ---- 278 1 1 279 280 # Regression test for #40589. 281 statement ok 282 CREATE TABLE IF NOT EXISTS t40589 AS 283 SELECT 284 '2001-01-01'::TIMESTAMPTZ + g * '1 day', 285 g * '1 day'::INTERVAL AS _interval, 286 g % 0 = 0 AS _bool, 287 g AS _decimal, 288 g, 289 g AS _bytes, 290 substring(NULL, NULL, NULL)::UUID AS _uuid, 291 '0.0.0.0'::INET + g AS _inet, 292 g AS _jsonb 293 FROM 294 generate_series(NULL, NULL) AS g; 295 296 query T 297 SELECT 298 ( 299 SELECT 300 NULL 301 FROM 302 t40589, 303 t40589 AS t0, 304 t40589 AS t1 305 INNER JOIN t40589 AS t2 ON true 306 JOIN t40589 AS t3 307 RIGHT JOIN t40589 AS t4 308 LEFT JOIN t40589 AS t5 ON 309 t._bool ON false ON 310 t1._uuid = t3._uuid 311 JOIN t40589 AS t6 312 JOIN t40589 AS t7 313 LEFT JOIN t40589 AS t8 ON true 314 JOIN t40589 AS t9 315 JOIN t40589 AS t10 ON true ON 316 true ON true ON true 317 WHERE 318 7.835752314020045477E+27 319 NOT IN (SELECT t6._decimal::DECIMAL) 320 AND true 321 ) 322 FROM 323 t40589 AS t, t40589; 324 ---- 325 326 # Test that a reasonable error is generated for the unsupported case of an 327 # apply join that references a top-level WITH clause. 328 329 statement ok 330 CREATE TABLE IF NOT EXISTS "cpk" ( 331 "key" VARCHAR(255) NOT NULL, 332 "value" INTEGER NOT NULL, 333 "extra" INTEGER NOT NULL, 334 PRIMARY KEY ("key", "value")) 335 336 statement ok 337 INSERT INTO "cpk" ("key", "value", "extra") 338 VALUES ('k1', 1, 1), ('k2', 2, 2), ('k3', 3, 3) 339 RETURNING "cpk"."key", "cpk"."value"; 340 341 # Inner join with correlated values prevents decorrelation. This ensures the 342 # final plan contains a correlated InnerJoin operator with a reference to the 343 # With clause. 344 query error couldn't find WITH expression \"new_values\" with ID 1 345 WITH "new_values" ("k", "v", "x") AS ( 346 VALUES ('k1', 1, 10), ('k3', 3, 30)) 347 UPDATE "cpk" SET "extra" = ( 348 SELECT y 349 FROM "new_values" 350 INNER JOIN (VALUES ("cpk"."value")) v(y) 351 ON TRUE 352 WHERE k='k1' 353 ) 354 WHERE (("cpk"."key", "cpk"."value") IN (SELECT "new_values"."k", "new_values"."v" FROM "new_values"));