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"));