@@ -7694,6 +7694,162 @@ With c as (
7694
7694
" └─ columns: [i]\n" +
7695
7695
"",
7696
7696
},
7697
+ {
7698
+ Query: `
7699
+ SELECT COUNT(*)
7700
+ FROM keyless
7701
+ WHERE keyless.c0 IN (
7702
+ WITH RECURSIVE cte(depth, i, j) AS (
7703
+ SELECT 0, T1.c0, T1.c1
7704
+ FROM keyless T1
7705
+ WHERE T1.c0 = 0
7706
+
7707
+ UNION ALL
7708
+
7709
+ SELECT cte.depth + 1, cte.i, T2.c1 + 1
7710
+ FROM cte, keyless T2
7711
+ WHERE cte.depth = T2.c0
7712
+ )
7713
+
7714
+ SELECT U0.c0
7715
+ FROM keyless U0, cte
7716
+ WHERE cte.j = keyless.c0
7717
+ );`,
7718
+ ExpectedPlan: "Project\n" +
7719
+ " ├─ columns: [COUNT(1):0!null as COUNT(*)]\n" +
7720
+ " └─ GroupBy\n" +
7721
+ " ├─ select: COUNT(1 (bigint))\n" +
7722
+ " ├─ group: \n" +
7723
+ " └─ Filter\n" +
7724
+ " ├─ InSubquery\n" +
7725
+ " │ ├─ left: keyless.c0:0\n" +
7726
+ " │ └─ right: Subquery\n" +
7727
+ " │ ├─ cacheable: false\n" +
7728
+ " │ └─ Project\n" +
7729
+ " │ ├─ columns: [U0.c0:2]\n" +
7730
+ " │ └─ Filter\n" +
7731
+ " │ ├─ Eq\n" +
7732
+ " │ │ ├─ cte.j:5\n" +
7733
+ " │ │ └─ keyless.c0:0\n" +
7734
+ " │ └─ CrossJoin\n" +
7735
+ " │ ├─ TableAlias(U0)\n" +
7736
+ " │ │ └─ Table\n" +
7737
+ " │ │ ├─ name: keyless\n" +
7738
+ " │ │ └─ columns: [c0]\n" +
7739
+ " │ └─ SubqueryAlias\n" +
7740
+ " │ ├─ name: cte\n" +
7741
+ " │ ├─ outerVisibility: true\n" +
7742
+ " │ ├─ cacheable: true\n" +
7743
+ " │ └─ RecursiveCTE\n" +
7744
+ " │ └─ Union all\n" +
7745
+ " │ ├─ Project\n" +
7746
+ " │ │ ├─ columns: [0 (tinyint), T1.c0:2, T1.c1:3]\n" +
7747
+ " │ │ └─ Filter\n" +
7748
+ " │ │ ├─ Eq\n" +
7749
+ " │ │ │ ├─ T1.c0:2\n" +
7750
+ " │ │ │ └─ 0 (tinyint)\n" +
7751
+ " │ │ └─ TableAlias(T1)\n" +
7752
+ " │ │ └─ Table\n" +
7753
+ " │ │ ├─ name: keyless\n" +
7754
+ " │ │ └─ columns: [c0 c1]\n" +
7755
+ " │ └─ Project\n" +
7756
+ " │ ├─ columns: [(cte.depth:3!null + 1 (tinyint)), cte.i:4, (T2.c1:7 + 1 (tinyint))]\n" +
7757
+ " │ └─ HashJoin\n" +
7758
+ " │ ├─ Eq\n" +
7759
+ " │ │ ├─ cte.depth:3!null\n" +
7760
+ " │ │ └─ T2.c0:6\n" +
7761
+ " │ ├─ RecursiveTable(cte)\n" +
7762
+ " │ └─ HashLookup\n" +
7763
+ " │ ├─ source: TUPLE(cte.depth:3!null)\n" +
7764
+ " │ ├─ target: TUPLE(T2.c0:2)\n" +
7765
+ " │ └─ CachedResults\n" +
7766
+ " │ └─ TableAlias(T2)\n" +
7767
+ " │ └─ Table\n" +
7768
+ " │ ├─ name: keyless\n" +
7769
+ " │ └─ columns: [c0 c1]\n" +
7770
+ " └─ Table\n" +
7771
+ " ├─ name: keyless\n" +
7772
+ " └─ columns: [c0 c1]\n" +
7773
+ "",
7774
+ },
7775
+ {
7776
+ Query: `
7777
+ SELECT COUNT(*)
7778
+ FROM keyless
7779
+ WHERE keyless.c0 IN (
7780
+ WITH RECURSIVE cte(depth, i, j) AS (
7781
+ SELECT 0, T1.c0, T1.c1
7782
+ FROM keyless T1
7783
+ WHERE T1.c0 = 0
7784
+
7785
+ UNION ALL
7786
+
7787
+ SELECT cte.depth + 1, cte.i, T2.c1 + 1
7788
+ FROM cte, keyless T2
7789
+ WHERE cte.depth = T2.c0
7790
+ )
7791
+
7792
+ SELECT U0.c0
7793
+ FROM cte, keyless U0
7794
+ WHERE cte.j = keyless.c0
7795
+ );`,
7796
+ ExpectedPlan: "Project\n" +
7797
+ " ├─ columns: [COUNT(1):0!null as COUNT(*)]\n" +
7798
+ " └─ GroupBy\n" +
7799
+ " ├─ select: COUNT(1 (bigint))\n" +
7800
+ " ├─ group: \n" +
7801
+ " └─ Filter\n" +
7802
+ " ├─ InSubquery\n" +
7803
+ " │ ├─ left: keyless.c0:0\n" +
7804
+ " │ └─ right: Subquery\n" +
7805
+ " │ ├─ cacheable: false\n" +
7806
+ " │ └─ Project\n" +
7807
+ " │ ├─ columns: [U0.c0:5]\n" +
7808
+ " │ └─ Filter\n" +
7809
+ " │ ├─ Eq\n" +
7810
+ " │ │ ├─ cte.j:4\n" +
7811
+ " │ │ └─ keyless.c0:0\n" +
7812
+ " │ └─ CrossJoin\n" +
7813
+ " │ ├─ SubqueryAlias\n" +
7814
+ " │ │ ├─ name: cte\n" +
7815
+ " │ │ ├─ outerVisibility: true\n" +
7816
+ " │ │ ├─ cacheable: true\n" +
7817
+ " │ │ └─ RecursiveCTE\n" +
7818
+ " │ │ └─ Union all\n" +
7819
+ " │ │ ├─ Project\n" +
7820
+ " │ │ │ ├─ columns: [0 (tinyint), T1.c0:2, T1.c1:3]\n" +
7821
+ " │ │ │ └─ Filter\n" +
7822
+ " │ │ │ ├─ Eq\n" +
7823
+ " │ │ │ │ ├─ T1.c0:2\n" +
7824
+ " │ │ │ │ └─ 0 (tinyint)\n" +
7825
+ " │ │ │ └─ TableAlias(T1)\n" +
7826
+ " │ │ │ └─ Table\n" +
7827
+ " │ │ │ ├─ name: keyless\n" +
7828
+ " │ │ │ └─ columns: [c0 c1]\n" +
7829
+ " │ │ └─ Project\n" +
7830
+ " │ │ ├─ columns: [(cte.depth:2!null + 1 (tinyint)), cte.i:3, (T2.c1:6 + 1 (tinyint))]\n" +
7831
+ " │ │ └─ HashJoin\n" +
7832
+ " │ │ ├─ Eq\n" +
7833
+ " │ │ │ ├─ cte.depth:2!null\n" +
7834
+ " │ │ │ └─ T2.c0:5\n" +
7835
+ " │ │ ├─ RecursiveTable(cte)\n" +
7836
+ " │ │ └─ HashLookup\n" +
7837
+ " │ │ ├─ source: TUPLE(cte.depth:2!null)\n" +
7838
+ " │ │ ├─ target: TUPLE(T2.c0:2)\n" +
7839
+ " │ │ └─ CachedResults\n" +
7840
+ " │ │ └─ TableAlias(T2)\n" +
7841
+ " │ │ └─ Table\n" +
7842
+ " │ │ ├─ name: keyless\n" +
7843
+ " │ │ └─ columns: [c0 c1]\n" +
7844
+ " │ └─ TableAlias(U0)\n" +
7845
+ " │ └─ Table\n" +
7846
+ " │ ├─ name: keyless\n" +
7847
+ " │ └─ columns: [c0]\n" +
7848
+ " └─ Table\n" +
7849
+ " ├─ name: keyless\n" +
7850
+ " └─ columns: [c0 c1]\n" +
7851
+ "",
7852
+ },
7697
7853
}
7698
7854
7699
7855
// QueryPlanTODOs are queries where the query planner produces a correct (results) but suboptimal plan.
0 commit comments