From 83ed8d3cbafdf3162011d51683e66a6eca1080a1 Mon Sep 17 00:00:00 2001 From: LiBinfeng <46676950+LiBinfeng-01@users.noreply.github.com> Date: Wed, 29 Nov 2023 21:08:08 +0800 Subject: [PATCH] [Feat](Nereids) join hint support stage one (#27378) support view as a independent unit of leading hint add random test check of leading hint query add more test with data of leading hint query add random test check of distribute hint --- .../docs/query-acceleration/hint/joinHint.md | 622 ++++ .../Manipulation/SELECT.md | 3 + .../docs/query-acceleration/hint/joinHint.md | 607 ++++ .../Manipulation/SELECT.md | 3 + .../apache/doris/nereids/CascadesContext.java | 16 + .../apache/doris/nereids/NereidsPlanner.java | 23 +- .../doris/nereids/StatementContext.java | 26 +- .../doris/nereids/hint/LeadingHint.java | 106 +- .../doris/nereids/hint/OrderedHint.java | 35 + .../doris/nereids/jobs/executor/Analyzer.java | 17 +- .../doris/nereids/jobs/executor/Rewriter.java | 15 +- .../hypergraph/bitmap/LongBitmap.java | 8 + .../nereids/parser/LogicalPlanBuilder.java | 4 + .../processor/pre/PlanPreprocessors.java | 1 - .../nereids/properties/SelectHintOrdered.java | 32 + .../apache/doris/nereids/rules/RuleType.java | 3 + .../nereids/rules/analysis/BindRelation.java | 9 +- .../CollectJoinConstraint.java | 56 +- .../rules/analysis/CollectSubQueryAlias.java | 69 + .../analysis}/EliminateLogicalSelectHint.java | 84 +- .../nereids/rules/analysis/LeadingJoin.java | 69 + .../LogicalSubQueryAliasToLogicalProject.java | 23 - ...{SemiJoinCommute.java => JoinCommute.java} | 4 +- .../nereids/rules/rewrite/LeadingJoin.java | 84 - .../trees/copier/LogicalPlanDeepCopier.java | 19 - .../doris/nereids/trees/plans/JoinType.java | 8 + .../trees/plans/logical/LogicalJoin.java | 7 +- .../plans/logical/LogicalSubQueryAlias.java | 19 + .../jobs/joinorder/joinhint/JoinHintTest.java | 153 + .../rules/rewrite/PushDownLimitTest.java | 15 +- .../doris/nereids/sqltest/InferTest.java | 8 +- .../doris/nereids/util/HyperGraphBuilder.java | 28 +- .../doris/nereids/util/MemoValidator.java | 3 +- regression-test/data/nereids_p0/hint/t1.csv | 1000 +++++++ regression-test/data/nereids_p0/hint/t2.csv | 1000 +++++++ regression-test/data/nereids_p0/hint/t3.csv | 1000 +++++++ regression-test/data/nereids_p0/hint/t4.csv | 1000 +++++++ .../data/nereids_p0/hint/test_leading.out | 2633 ++++++++++++++--- .../suites/nereids_hint_tpch_p0/load.groovy | 223 -- .../nereids_hint_tpch_p0/shape/q1.groovy | 57 - .../nereids_hint_tpch_p0/shape/q10.groovy | 72 - .../nereids_hint_tpch_p0/shape/q12.groovy | 68 - .../nereids_hint_tpch_p0/shape/q13.groovy | 57 - .../nereids_hint_tpch_p0/shape/q14.groovy | 50 - .../nereids_hint_tpch_p0/shape/q16.groovy | 70 - .../nereids_hint_tpch_p0/shape/q19.groovy | 77 - .../nereids_hint_tpch_p0/shape/q3.groovy | 67 - .../nereids_hint_tpch_p0/shape/q4.groovy | 63 - .../nereids_hint_tpch_p0/shape/q5.groovy | 63 - .../nereids_hint_tpch_p0/shape/q6.groovy | 45 - .../nereids_hint_tpch_p0/shape/q9.groovy | 69 - .../nereids_p0/hint/test_leading.groovy | 937 +++++- 52 files changed, 9019 insertions(+), 1711 deletions(-) create mode 100644 docs/en/docs/query-acceleration/hint/joinHint.md create mode 100644 docs/zh-CN/docs/query-acceleration/hint/joinHint.md create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/hint/OrderedHint.java create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/properties/SelectHintOrdered.java rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/{rewrite => analysis}/CollectJoinConstraint.java (82%) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CollectSubQueryAlias.java rename fe/fe-core/src/main/java/org/apache/doris/nereids/{processor/pre => rules/analysis}/EliminateLogicalSelectHint.java (55%) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/LeadingJoin.java rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{SemiJoinCommute.java => JoinCommute.java} (92%) delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/LeadingJoin.java create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/joinhint/JoinHintTest.java create mode 100644 regression-test/data/nereids_p0/hint/t1.csv create mode 100644 regression-test/data/nereids_p0/hint/t2.csv create mode 100644 regression-test/data/nereids_p0/hint/t3.csv create mode 100644 regression-test/data/nereids_p0/hint/t4.csv delete mode 100644 regression-test/suites/nereids_hint_tpch_p0/load.groovy delete mode 100644 regression-test/suites/nereids_hint_tpch_p0/shape/q1.groovy delete mode 100644 regression-test/suites/nereids_hint_tpch_p0/shape/q10.groovy delete mode 100644 regression-test/suites/nereids_hint_tpch_p0/shape/q12.groovy delete mode 100644 regression-test/suites/nereids_hint_tpch_p0/shape/q13.groovy delete mode 100644 regression-test/suites/nereids_hint_tpch_p0/shape/q14.groovy delete mode 100644 regression-test/suites/nereids_hint_tpch_p0/shape/q16.groovy delete mode 100644 regression-test/suites/nereids_hint_tpch_p0/shape/q19.groovy delete mode 100644 regression-test/suites/nereids_hint_tpch_p0/shape/q3.groovy delete mode 100644 regression-test/suites/nereids_hint_tpch_p0/shape/q4.groovy delete mode 100644 regression-test/suites/nereids_hint_tpch_p0/shape/q5.groovy delete mode 100644 regression-test/suites/nereids_hint_tpch_p0/shape/q6.groovy delete mode 100644 regression-test/suites/nereids_hint_tpch_p0/shape/q9.groovy diff --git a/docs/en/docs/query-acceleration/hint/joinHint.md b/docs/en/docs/query-acceleration/hint/joinHint.md new file mode 100644 index 0000000000..5ce63cfe70 --- /dev/null +++ b/docs/en/docs/query-acceleration/hint/joinHint.md @@ -0,0 +1,622 @@ +# join hint using document + +In the database, "Hint" is an instruction that instructs the query optimizer to execute a plan. By embedding hints in SQL statements, you can influence the optimizer's decision to select the desired execution path. Here is a background example using Hint: + +Suppose you have a table that contains a large amount of data, and you know that in some specific circumstances, the join order of the tables in a query may affect query performance. Leading Hint allows you to specify the order of table joins that you want the optimizer to follow. + +For example, consider the following SQL query: +```sql +mysql> explain shape plan select * from t1 join t2 on t1.c1 = c2; ++-------------------------------------------+ +| Explain String | ++-------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN](t1.c1 = t2.c2) | +| --------PhysicalOlapScan[t2] | +| --------PhysicalDistribute | +| ----------PhysicalOlapScan[t1] | ++-------------------------------------------+ +7 rows in set (0.06 sec) +``` + +In the above example, when the execution efficiency is not ideal, we want to adjust the join order without changing the original sql so as to avoid affecting the user's original scene and achieve the purpose of tuning. We can use leading to arbitrarily change the join order of tableA and tableB. For example, it could be written like: +```sql +mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = c2; ++-----------------------------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++-----------------------------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() build RFs:RF0 c1->[c2] | +| --------PhysicalOlapScan[t2] apply RFs: RF0 | +| --------PhysicalDistribute | +| ----------PhysicalOlapScan[t1] | +| | +| Hint log: | +| Used: leading(t2 t1) | +| UnUsed: | +| SyntaxError: | ++-----------------------------------------------------------------------------------------------------+ +12 rows in set (0.06 sec) +``` +In this example, the Hint /*+ leading(t2 t1) */ is used. This Hint tells the optimizer to use the specified table (t2) as the driver table in the execution plan, before (t1). + +This document mainly describes how to use join related hints in Doris: leading hint, ordered hint and distribute hint +# Leading hint +Leading Hint is used to guide the optimizer in determining the join order of the query plan. In a query, the join order of the tables can affect query performance. Leading Hint allows you to specify the order of table joins that you want the optimizer to follow. + +In doris, the syntax is /*+LEADING(tablespec [tablespec]... ) */,leading is surrounded by "/*+" and "*/" and placed directly behind the select in the select statement. Note that the '/' after leading and the selectlist need to be separated by at least one separator such as a space. At least two more tables need to be written before the leadinghint is justified. And any join can be bracketed to explicitly specify the shape of the joinTree. Example: +```sql +mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = c2; ++------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| --------PhysicalOlapScan[t2] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------PhysicalOlapScan[t1] | +| | +| Hint log: | +| Used: leading(t2 t1) | +| UnUsed: | +| SyntaxError: | ++------------------------------------------------------------------------------+ +12 rows in set (0.01 sec) +``` +- If the leadinghint fails to take effect, the explain process will be used to generate the leadinghint. The EXPLAIN process will display whether the Leadinghint takes effect. There are three types of hints: + + - Used: leading hint takes effect normally + + - Unused: Unsupported cases include the feature that the leading specified join order is not equivalent to the original sql or is not supported in this version (see restrictions). + + - SyntaxError: indicates leading hint syntax errors, such as failure to find the corresponding table + +- The leading hint syntax creates a left deep tree by default. For example, select /*+ leading(t1 t2 t3) */ * from t1 join t2 on... Specify by default +```sql + join + / \ + join t3 + / \ + t1 t2 + +mysql> explain shape plan select /*+ leading(t1 t2 t3) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; ++--------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++--------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | +| --------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| ----------PhysicalOlapScan[t1] | +| ----------PhysicalDistribute[DistributionSpecHash] | +| ------------PhysicalOlapScan[t2] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------PhysicalOlapScan[t3] | +| | +| Hint log: | +| Used: leading(t1 t2 t3) | +| UnUsed: | +| SyntaxError: | ++--------------------------------------------------------------------------------+ +15 rows in set (0.00 sec) +``` +The join tree shape is also allowed to be specified using braces. For example: /*+ leading(t1 {t2 t3}) */ +```sql + join + / \ + t1 join + / \ + t2 t3 + +mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; ++----------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++----------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| --------PhysicalOlapScan[t1] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | +| ------------PhysicalOlapScan[t2] | +| ------------PhysicalDistribute[DistributionSpecHash] | +| --------------PhysicalOlapScan[t3] | +| | +| Hint log: | +| Used: leading(t1 { t2 t3 }) | +| UnUsed: | +| SyntaxError: | ++----------------------------------------------------------------------------------+ +15 rows in set (0.02 sec) +``` + +- When a view is used as an alias in joinReorder, the corresponding view can be specified as the leading parameter. Example: +```sql +mysql> explain shape plan select /*+ leading(alias t1) */ count(*) from t1 join (select c2 from t2 join t3 on t2.c2 = t3.c3) as alias on t1.c1 = alias.c2; + +--------------------------------------------------------------------------------------+ + | Explain String(Nereids Planner) | + +--------------------------------------------------------------------------------------+ + | PhysicalResultSink | + | --hashAgg[GLOBAL] | + | ----PhysicalDistribute[DistributionSpecGather] | + | ------hashAgg[LOCAL] | + | --------PhysicalProject | + | ----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = alias.c2)) otherCondition=() | + | ------------PhysicalProject | + | --------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | + | ----------------PhysicalProject | + | ------------------PhysicalOlapScan[t2] | + | ----------------PhysicalDistribute[DistributionSpecHash] | + | ------------------PhysicalProject | + | --------------------PhysicalOlapScan[t3] | + | ------------PhysicalDistribute[DistributionSpecHash] | + | --------------PhysicalProject | + | ----------------PhysicalOlapScan[t1] | + | | + | Hint log: | + | Used: leading(alias t1) | + | UnUsed: | + | SyntaxError: | + +--------------------------------------------------------------------------------------+ + 21 rows in set (0.06 sec) +``` +## Basic cases + (Note that the column name is related to the table name, for example: only t1 has c1 field, the following example will write t1.c1 directly to c1 for simplicity) +```sql +CREATE DATABASE testleading; +USE testleading; + +create table t1 (c1 int, c11 int) distributed by hash(c1) buckets 3 properties('replication_num' = '1'); +create table t2 (c2 int, c22 int) distributed by hash(c2) buckets 3 properties('replication_num' = '1'); +create table t3 (c3 int, c33 int) distributed by hash(c3) buckets 3 properties('replication_num' = '1'); +create table t4 (c4 int, c44 int) distributed by hash(c4) buckets 3 properties('replication_num' = '1'); + +``` +For a simple example, when we need to exchange the join order of t1 and t2, we only need to add leading(t2 t1) before it, which will be used in the explain +Shows whether the hint is used. +original plan +```sql +mysql> explain shape plan select * from t1 join t2 on t1.c1 = c2; ++-------------------------------------------+ +| Explain String | ++-------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN](t1.c1 = t2.c2) | +| --------PhysicalOlapScan[t2] | +| --------PhysicalDistribute | +| ----------PhysicalOlapScan[t1] | ++-------------------------------------------+ +7 rows in set (0.06 sec) + ``` +Leading plan +```sql +mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = c2; ++------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| --------PhysicalOlapScan[t2] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------PhysicalOlapScan[t1] | +| | +| Hint log: | +| Used: leading(t2 t1) | +| UnUsed: | +| SyntaxError: | ++------------------------------------------------------------------------------+ +12 rows in set (0.00 sec) + ``` +hint effect display +(Used unused) +If the leading hint has a syntax error, the corresponding information is displayed in the syntax Error when explaining, but the plan is generated as usual, just without leading +```sql +mysql> explain shape plan select /*+ leading(t2 t3) */ * from t1 join t2 on t1.c1 = c2; ++--------------------------------------------------------+ +| Explain String | ++--------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN](t1.c1 = t2.c2) | +| --------PhysicalOlapScan[t1] | +| --------PhysicalDistribute | +| ----------PhysicalOlapScan[t2] | +| | +| Used: | +| UnUsed: | +| SyntaxError: leading(t2 t3) Msg:can not find table: t3 | ++--------------------------------------------------------+ +11 rows in set (0.01 sec) + ``` +## more cases +### Left deep tree +leading generates a left deep tree by default when we don't use any parentheses +```sql +mysql> explain shape plan select /*+ leading(t1 t2 t3) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; ++--------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++--------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | +| --------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| ----------PhysicalOlapScan[t1] | +| ----------PhysicalDistribute[DistributionSpecHash] | +| ------------PhysicalOlapScan[t2] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------PhysicalOlapScan[t3] | +| | +| Hint log: | +| Used: leading(t1 t2 t3) | +| UnUsed: | +| SyntaxError: | ++--------------------------------------------------------------------------------+ +15 rows in set (0.10 sec) + ``` +### Right deep tree +When we want to make the shape of the plan into a right deep tree, bushy tree or zigzag tree, we only need to add curly brackets to limit the shape of the plan, instead of using swap to adjust from the left deep tree step by step like oracle. +```sql +mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; ++-----------------------------------------------+ +| Explain String | ++-----------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN](t1.c1 = t2.c2) | +| --------PhysicalOlapScan[t1] | +| --------PhysicalDistribute | +| ----------hashJoin[INNER_JOIN](t2.c2 = t3.c3) | +| ------------PhysicalOlapScan[t2] | +| ------------PhysicalDistribute | +| --------------PhysicalOlapScan[t3] | +| | +| Used: leading(t1 { t2 t3 }) | +| UnUsed: | +| SyntaxError: | ++-----------------------------------------------+ +14 rows in set (0.02 sec) + ``` +### Bushy tree +```sql +mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; ++-----------------------------------------------+ +| Explain String | ++-----------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN](t2.c2 = t3.c3) | +| --------hashJoin[INNER_JOIN](t1.c1 = t2.c2) | +| ----------PhysicalOlapScan[t1] | +| ----------PhysicalDistribute | +| ------------PhysicalOlapScan[t2] | +| --------PhysicalDistribute | +| ----------hashJoin[INNER_JOIN](t3.c3 = t4.c4) | +| ------------PhysicalOlapScan[t3] | +| ------------PhysicalDistribute | +| --------------PhysicalOlapScan[t4] | +| | +| Used: leading({ t1 t2 } { t3 t4 }) | +| UnUsed: | +| SyntaxError: | ++-----------------------------------------------+ +17 rows in set (0.02 sec) + ``` +### zig-zag tree +```sql +mysql> explain shape plan select /*+ leading(t1 {t2 t3} t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; ++--------------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++--------------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t3.c3 = t4.c4)) otherCondition=() | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| ------------PhysicalOlapScan[t1] | +| ------------PhysicalDistribute[DistributionSpecHash] | +| --------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | +| ----------------PhysicalOlapScan[t2] | +| ----------------PhysicalDistribute[DistributionSpecHash] | +| ------------------PhysicalOlapScan[t3] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------PhysicalOlapScan[t4] | +| | +| Hint log: | +| Used: leading(t1 { t2 t3 } t4) | +| UnUsed: | +| SyntaxError: | ++--------------------------------------------------------------------------------------+ +19 rows in set (0.02 sec) + ``` +## Non-inner join: +When non-inner-joins are encountered, such as Outer join or semi/anti join, leading hint automatically deduces the join mode of each join according to the original sql semantics. If leading hints that differ from the original sql semantics or cannot be generated, they are placed in unused, but do not affect the generation of the normal flow of the plan. + +Here are examples of things that can't be exchanged: +-------- test outer join which can not swap +-- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) +```sql +mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; ++--------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++--------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | +| --------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| ----------PhysicalOlapScan[t1] | +| ----------PhysicalDistribute[DistributionSpecHash] | +| ------------PhysicalOlapScan[t2] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------PhysicalOlapScan[t3] | +| | +| Hint log: | +| Used: | +| UnUsed: leading(t1 { t2 t3 }) | +| SyntaxError: | ++--------------------------------------------------------------------------------+ +15 rows in set (0.01 sec) + ``` +Below are some examples that can be exchanged and examples that cannot be exchanged, which readers can verify for themselves +```sql +-------- test outer join which can swap +-- (t1 leftjoin t2 on (P12)) innerjoin t3 on (P13) = (t1 innerjoin t3 on (P13)) leftjoin t2 on (P12) +explain shape plan select * from t1 left join t2 on c1 = c2 join t3 on c1 = c3; +explain shape plan select /*+ leading(t1 t3 t2) */ * from t1 left join t2 on c1 = c2 join t3 on c1 = c3; + +-- (t1 leftjoin t2 on (P12)) leftjoin t3 on (P13) = (t1 leftjoin t3 on (P13)) leftjoin t2 on (P12) +explain shape plan select * from t1 left join t2 on c1 = c2 left join t3 on c1 = c3; +explain shape plan select /*+ leading(t1 t3 t2) */ * from t1 left join t2 on c1 = c2 left join t3 on c1 = c3; + +-- (t1 leftjoin t2 on (P12)) leftjoin t3 on (P23) = t1 leftjoin (t2 leftjoin t3 on (P23)) on (P12) +select /*+ leading(t2 t3 t1) SWAP_INPUT(t1) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; +explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; +explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; + +-------- test outer join which can not swap +-- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) +-- eliminated to inner join +explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; +explain graph select /*+ leading(t1 t2 t3) */ * from t1 left join (select * from t2 join t3 on c2 = c3) on c1 = c2; + +-- test semi join +explain shape plan select * from t1 where c1 in (select c2 from t2); +explain shape plan select /*+ leading(t2 t1) */ * from t1 where c1 in (select c2 from t2); + +-- test anti join +explain shape plan select * from t1 where exists (select c2 from t2); +``` +## View +In the case of aliases, you can specify the alias as a complete subtree with joinOrder generated from text order. +```sql +mysql> explain shape plan select /*+ leading(alias t1) */ count(*) from t1 join (select c2 from t2 join t3 on t2.c2 = t3.c3) as alias on t1.c1 = alias.c2; ++--------------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++--------------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --hashAgg[GLOBAL] | +| ----PhysicalDistribute[DistributionSpecGather] | +| ------hashAgg[LOCAL] | +| --------PhysicalProject | +| ----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = alias.c2)) otherCondition=() | +| ------------PhysicalProject | +| --------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | +| ----------------PhysicalProject | +| ------------------PhysicalOlapScan[t2] | +| ----------------PhysicalDistribute[DistributionSpecHash] | +| ------------------PhysicalProject | +| --------------------PhysicalOlapScan[t3] | +| ------------PhysicalDistribute[DistributionSpecHash] | +| --------------PhysicalProject | +| ----------------PhysicalOlapScan[t1] | +| | +| Hint log: | +| Used: leading(alias t1) | +| UnUsed: | +| SyntaxError: | ++--------------------------------------------------------------------------------------+ +21 rows in set (0.02 sec) + ``` +## mixed with ordered hint +When ordered hint is used together with ordered hint, ordered hint takes effect with a higher priority than leading hint. Example: +```sql +mysql> explain shape plan select /*+ ORDERED LEADING(t1 t2 t3) */ t1.c1 from t2 join t1 on t1.c1 = t2.c2 join t3 on c2 = c3; ++--------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++--------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | +| --------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| ----------PhysicalProject | +| ------------PhysicalOlapScan[t2] | +| ----------PhysicalDistribute[DistributionSpecHash] | +| ------------PhysicalProject | +| --------------PhysicalOlapScan[t1] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------PhysicalProject | +| ------------PhysicalOlapScan[t3] | +| | +| Hint log: | +| Used: ORDERED | +| UnUsed: leading(t1 t2 t3) | +| SyntaxError: | ++--------------------------------------------------------------------------------+ +18 rows in set (0.02 sec) + ``` +## Limitation +- The current version supports only one leadingHint. If leadinghint is used with a subquery, the query will report an error. Example (This example explain will report an error, but will follow the normal path generation plan) : +```sql +mysql> explain shape plan select /*+ leading(alias t1) */ count(*) from t1 join (select /*+ leading(t3 t2) */ c2 from t2 join t3 on t2.c2 = t3.c3) as alias on t1.c1 = alias.c2; + +----------------------------------------------------------------------------------------+ + | Explain String(Nereids Planner) | + +----------------------------------------------------------------------------------------+ + | PhysicalResultSink | + | --hashAgg[GLOBAL] | + | ----PhysicalDistribute[DistributionSpecGather] | + | ------hashAgg[LOCAL] | + | --------PhysicalProject | + | ----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = alias.c2)) otherCondition=() | + | ------------PhysicalProject | + | --------------PhysicalOlapScan[t1] | + | ------------PhysicalDistribute[DistributionSpecHash] | + | --------------PhysicalProject | + | ----------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | + | ------------------PhysicalProject | + | --------------------PhysicalOlapScan[t2] | + | ------------------PhysicalDistribute[DistributionSpecHash] | + | --------------------PhysicalProject | + | ----------------------PhysicalOlapScan[t3] | + | | + | Hint log: | + | Used: | + | UnUsed: leading(alias t1) | + | SyntaxError: leading(t3 t2) Msg:one query block can only have one leading clause | + +----------------------------------------------------------------------------------------+ + 21 rows in set (0.01 sec) +``` + # OrderedHint +- Using ordered hint causes the join tree to be fixed in shape and displayed in text order +- The syntax is /*+ ORDERED */,leading is surrounded by "/*+" and "*/" and placed directly behind the select in the select statement, for example: +```sql + explain shape plan select /*+ ORDERED */ t1.c1 from t2 join t1 on t1.c1 = t2.c2 join t3 on c2 = c3; + join + / \ + join t3 + / \ + t2 t1 + +mysql> explain shape plan select /*+ ORDERED */ t1.c1 from t2 join t1 on t1.c1 = t2.c2 join t3 on c2 = c3; ++--------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++--------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | +| --------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| ----------PhysicalProject | +| ------------PhysicalOlapScan[t2] | +| ----------PhysicalDistribute[DistributionSpecHash] | +| ------------PhysicalProject | +| --------------PhysicalOlapScan[t1] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------PhysicalProject | +| ------------PhysicalOlapScan[t3] | +| | +| Hint log: | +| Used: ORDERED | +| UnUsed: | +| SyntaxError: | ++--------------------------------------------------------------------------------+ +18 rows in set (0.02 sec) + ``` +- When ordered hint and leading hint are used at the same time, the ordered hint prevails and the leading hint becomes invalid +```sql +mysql> explain shape plan select /*+ ORDERED LEADING(t1 t2 t3) */ t1.c1 from t2 join t1 on t1.c1 = t2.c2 join t3 on c2 = c3; + +--------------------------------------------------------------------------------+ + | Explain String(Nereids Planner) | + +--------------------------------------------------------------------------------+ + | PhysicalResultSink | + | --PhysicalDistribute[DistributionSpecGather] | + | ----PhysicalProject | + | ------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | + | --------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | + | ----------PhysicalProject | + | ------------PhysicalOlapScan[t2] | + | ----------PhysicalDistribute[DistributionSpecHash] | + | ------------PhysicalProject | + | --------------PhysicalOlapScan[t1] | + | --------PhysicalDistribute[DistributionSpecHash] | + | ----------PhysicalProject | + | ------------PhysicalOlapScan[t3] | + | | + | Hint log: | + | Used: ORDERED | + | UnUsed: leading(t1 t2 t3) | + | SyntaxError: | + +--------------------------------------------------------------------------------+ + 18 rows in set (0.02 sec) + ``` +# DistributeHint +- Currently, only the distribute Type of the right table can be specified, and only two types are available: [shuffle] and [broadcast]. They are written before the right join table. Brackets and /*+ */ are allowed + +- Currently you can use any DistributeHint + +- When a DistributeHint whose plan cannot be correctly generated is not displayed, it takes effect based on maximum effort. Finally, the distribute mode that is displayed is mainly explained + +- The current distribute version is not combined with leading. It takes effect only when the table specified in DISTRIBUTE is on the right of join. + +- Mixed with ordered, the text order is used to set the join order and then specify the expected distribute mode in the corresponding join. Example: + +Before use distribute hint: +```sql +mysql> explain shape plan select count(*) from t1 join t2 on t1.c1 = t2.c2; + +----------------------------------------------------------------------------------+ + | Explain String(Nereids Planner) | + +----------------------------------------------------------------------------------+ + | PhysicalResultSink | + | --hashAgg[GLOBAL] | + | ----PhysicalDistribute[DistributionSpecGather] | + | ------hashAgg[LOCAL] | + | --------PhysicalProject | + | ----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | + | ------------PhysicalProject | + | --------------PhysicalOlapScan[t1] | + | ------------PhysicalDistribute[DistributionSpecHash] | + | --------------PhysicalProject | + | ----------------PhysicalOlapScan[t2] | + +----------------------------------------------------------------------------------+ + 11 rows in set (0.01 sec) + ``` + + after use distribute hint: + ```sql +mysql> explain shape plan select /*+ ordered */ count(*) from t2 join[broadcast] t1 on t1.c1 = t2.c2; + +----------------------------------------------------------------------------------+ + | Explain String(Nereids Planner) | + +----------------------------------------------------------------------------------+ + | PhysicalResultSink | + | --hashAgg[GLOBAL] | + | ----PhysicalDistribute[DistributionSpecGather] | + | ------hashAgg[LOCAL] | + | --------PhysicalProject | + | ----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | + | ------------PhysicalProject | + | --------------PhysicalOlapScan[t2] | + | ------------PhysicalDistribute[DistributionSpecReplicated] | + | --------------PhysicalProject | + | ----------------PhysicalOlapScan[t1] | + | | + | Hint log: | + | Used: ORDERED | + | UnUsed: | + | SyntaxError: | + +----------------------------------------------------------------------------------+ + 16 rows in set (0.01 sec) + ``` +- the Explain shape plan will display inside distribute operator related information, including DistributionSpecReplicated said the operator will be corresponding data into a copy of all be node, DistributionSpecGather indicates that data is gathered to fe nodes, and DistributionSpecHash indicates that data is dispersed to different be nodes according to a specific hashKey and algorithm. +# To be supported +- leadingHint indicates that the current query cannot be mixed with the subquery after it is promoted. A hint is required to control whether the subquery can be unnested + +- A new distributeHint is needed for better and more complete control of the distribute operator + +- Use leadingHint and distributeHint together to determine the shape of a join diff --git a/docs/en/docs/sql-manual/sql-reference/Data-Manipulation-Statements/Manipulation/SELECT.md b/docs/en/docs/sql-manual/sql-reference/Data-Manipulation-Statements/Manipulation/SELECT.md index f3d5df7184..fd79f1131a 100644 --- a/docs/en/docs/sql-manual/sql-reference/Data-Manipulation-Statements/Manipulation/SELECT.md +++ b/docs/en/docs/sql-manual/sql-reference/Data-Manipulation-Statements/Manipulation/SELECT.md @@ -39,6 +39,7 @@ grammar: ```sql SELECT + [hint_statement, ...] [ALL | DISTINCT | DISTINCTROW | ALL EXCEPT ( col_name1 [, col_name2, col_name3, ...] )] select_expr [, select_expr ...] [FROM table_references @@ -86,6 +87,8 @@ SELECT 11. SELECT supports explicit partition selection using PARTITION containing a list of partitions or subpartitions (or both) following the name of the table in `table_reference` 12. `[TABLET tids] TABLESAMPLE n [ROWS | PERCENT] [REPEATABLE seek]`: Limit the number of rows read from the table in the FROM clause, select a number of Tablets pseudo-randomly from the table according to the specified number of rows or percentages, and specify the number of seeds in REPEATABLE to return the selected samples again. In addition, you can also manually specify the TableID, Note that this can only be used for OLAP tables. + + 13. `hint_statement`: hint in front of the selectlist indicates that hints can be used to influence the behavior of the optimizer in order to obtain the desired execution plan. Details refer to [joinHint using document] (https://doris.apache.org/en/docs/query-acceleration/hint/joinHint.md) **Syntax constraints:** diff --git a/docs/zh-CN/docs/query-acceleration/hint/joinHint.md b/docs/zh-CN/docs/query-acceleration/hint/joinHint.md new file mode 100644 index 0000000000..269eb9a7ee --- /dev/null +++ b/docs/zh-CN/docs/query-acceleration/hint/joinHint.md @@ -0,0 +1,607 @@ +# join hint 使用文档 +# 背景 +在数据库中,"Hint" 是一种用于指导查询优化器执行计划的指令。通过在SQL语句中嵌入Hint,可以影响优化器的决策,以选中期望的执行路径。以下是一个使用Hint的背景示例: +假设有一个包含大量数据的表,而你知道在某些特定情况下,在一个查询中,表的连接顺序可能会影响查询性能。Leading Hint允许你指定希望优化器遵循的表连接的顺序。 +例如,考虑以下SQL查询: +```sql +mysql> explain shape plan select * from t1 join t2 on t1.c1 = c2; ++-------------------------------------------+ +| Explain String | ++-------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN](t1.c1 = t2.c2) | +| --------PhysicalOlapScan[t2] | +| --------PhysicalDistribute | +| ----------PhysicalOlapScan[t1] | ++-------------------------------------------+ +7 rows in set (0.06 sec) +``` + +在上述例子里面,在执行效率不理想的时候,我们希望调整下join顺序而不改变原始sql以免影响到用户原始场景且能达到调优的目的。我们可以使用leading任意改变tableA和tableB的join顺序。例如可以写成: +```sql +mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = c2; ++-----------------------------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++-----------------------------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() build RFs:RF0 c1->[c2] | +| --------PhysicalOlapScan[t2] apply RFs: RF0 | +| --------PhysicalDistribute | +| ----------PhysicalOlapScan[t1] | +| | +| Hint log: | +| Used: leading(t2 t1) | +| UnUsed: | +| SyntaxError: | ++-----------------------------------------------------------------------------------------------------+ +12 rows in set (0.06 sec) +``` +在这个例子中,使用了 /*+ leading(t2 t1) */ 这个Hint。这个Hint告诉优化器在执行计划中使用指定表(t2)作为驱动表,并置于(t1)之前。 +本文主要阐述如何在Doris里面使用join相关的hint:leading hint、ordered hint 和 distribute hint +# Leading hint使用说明 +Leading Hint 用于指导优化器确定查询计划的连接顺序。在一个查询中,表的连接顺序可能会影响查询性能。Leading Hint允许你指定希望优化器遵循的表连接的顺序。 +在doris里面,其语法为 /*+LEADING( tablespec [ tablespec ]... ) */,leading由"/*+"和"*/"包围并置于select语句里面 select的正后方。注意,leading 后方的 '/' 和selectlist需要隔开至少一个分割符例如空格。至少需要写两个以上的表才认为这个leadinghint是合理的。且任意的join里面可以用大括号括号起来,来显式地指定joinTree的形状。例: +```sql +mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = c2; ++------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| --------PhysicalOlapScan[t2] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------PhysicalOlapScan[t1] | +| | +| Hint log: | +| Used: leading(t2 t1) | +| UnUsed: | +| SyntaxError: | ++------------------------------------------------------------------------------+ +12 rows in set (0.01 sec) +``` +- 当leadinghint不生效的时候会走正常的流程生成计划,explain会显示使用的hint是否生效,主要分三种来显示: + - Used:leading hint正常生效 + - Unused: 这里不支持的情况包含leading指定的join order与原sql不等价或本版本暂不支持特性(详见限制) + - SyntaxError: 指leading hint语法错误,如找不到对应的表等 +- leading hint语法默认造出来左深树,例:select /*+ leading(t1 t2 t3) */ * from t1 join t2 on...默认指定出来 +```sql + join + / \ + join t3 + / \ + t1 t2 + +mysql> explain shape plan select /*+ leading(t1 t2 t3) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; ++--------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++--------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | +| --------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| ----------PhysicalOlapScan[t1] | +| ----------PhysicalDistribute[DistributionSpecHash] | +| ------------PhysicalOlapScan[t2] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------PhysicalOlapScan[t3] | +| | +| Hint log: | +| Used: leading(t1 t2 t3) | +| UnUsed: | +| SyntaxError: | ++--------------------------------------------------------------------------------+ +15 rows in set (0.00 sec) +``` + +- 同时允许使用大括号指定join树形状。例:/*+ leading(t1 {t2 t3}) */ + join + / \ + t1 join + / \ + t2 t3 + +```sql +mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; ++----------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++----------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| --------PhysicalOlapScan[t1] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | +| ------------PhysicalOlapScan[t2] | +| ------------PhysicalDistribute[DistributionSpecHash] | +| --------------PhysicalOlapScan[t3] | +| | +| Hint log: | +| Used: leading(t1 { t2 t3 }) | +| UnUsed: | +| SyntaxError: | ++----------------------------------------------------------------------------------+ +15 rows in set (0.02 sec) +``` + +- 当有view作为别名参与joinReorder的时候可以指定对应的view作为leading的参数。例: +```sql +mysql> explain shape plan select /*+ leading(alias t1) */ count(*) from t1 join (select c2 from t2 join t3 on t2.c2 = t3.c3) as alias on t1.c1 = alias.c2; + +--------------------------------------------------------------------------------------+ + | Explain String(Nereids Planner) | + +--------------------------------------------------------------------------------------+ + | PhysicalResultSink | + | --hashAgg[GLOBAL] | + | ----PhysicalDistribute[DistributionSpecGather] | + | ------hashAgg[LOCAL] | + | --------PhysicalProject | + | ----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = alias.c2)) otherCondition=() | + | ------------PhysicalProject | + | --------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | + | ----------------PhysicalProject | + | ------------------PhysicalOlapScan[t2] | + | ----------------PhysicalDistribute[DistributionSpecHash] | + | ------------------PhysicalProject | + | --------------------PhysicalOlapScan[t3] | + | ------------PhysicalDistribute[DistributionSpecHash] | + | --------------PhysicalProject | + | ----------------PhysicalOlapScan[t1] | + | | + | Hint log: | + | Used: leading(alias t1) | + | UnUsed: | + | SyntaxError: | + +--------------------------------------------------------------------------------------+ + 21 rows in set (0.06 sec) +``` +## 基本用例 + (注意这里列命名和表命名相关,例:只有t1中有c1字段,后续例子为了简化会将 t1.c1 直接写成 c1) +```sql +CREATE DATABASE testleading; +USE testleading; + +create table t1 (c1 int, c11 int) distributed by hash(c1) buckets 3 properties('replication_num' = '1'); +create table t2 (c2 int, c22 int) distributed by hash(c2) buckets 3 properties('replication_num' = '1'); +create table t3 (c3 int, c33 int) distributed by hash(c3) buckets 3 properties('replication_num' = '1'); +create table t4 (c4 int, c44 int) distributed by hash(c4) buckets 3 properties('replication_num' = '1'); + +``` +举个简单的例子,当我们需要交换t1和t2的join顺序的时候只需要在前面加上leading(t2 t1)即可,explain的时候会 +显示是否用上了这个hint。 +原始plan +```sql +mysql> explain shape plan select * from t1 join t2 on t1.c1 = c2; ++-------------------------------------------+ +| Explain String | ++-------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN](t1.c1 = t2.c2) | +| --------PhysicalOlapScan[t2] | +| --------PhysicalDistribute | +| ----------PhysicalOlapScan[t1] | ++-------------------------------------------+ +7 rows in set (0.06 sec) + ``` +Leading plan +```sql +mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = c2; ++------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| --------PhysicalOlapScan[t2] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------PhysicalOlapScan[t1] | +| | +| Hint log: | +| Used: leading(t2 t1) | +| UnUsed: | +| SyntaxError: | ++------------------------------------------------------------------------------+ +12 rows in set (0.00 sec) + ``` +hint 效果展示 +(Used unused) +若leading hint有语法错误,explain的时候会在syntax error里面显示相应的信息,但是计划能照常生成,只不过没有使用leading而已 +```sql +mysql> explain shape plan select /*+ leading(t2 t3) */ * from t1 join t2 on t1.c1 = c2; ++--------------------------------------------------------+ +| Explain String | ++--------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN](t1.c1 = t2.c2) | +| --------PhysicalOlapScan[t1] | +| --------PhysicalDistribute | +| ----------PhysicalOlapScan[t2] | +| | +| Used: | +| UnUsed: | +| SyntaxError: leading(t2 t3) Msg:can not find table: t3 | ++--------------------------------------------------------+ +11 rows in set (0.01 sec) + ``` +## 扩展场景 +### 左深树 +当我们不使用任何括号的情况下leading会默认生成左深树 +```sql +mysql> explain shape plan select /*+ leading(t1 t2 t3) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; ++--------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++--------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | +| --------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| ----------PhysicalOlapScan[t1] | +| ----------PhysicalDistribute[DistributionSpecHash] | +| ------------PhysicalOlapScan[t2] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------PhysicalOlapScan[t3] | +| | +| Hint log: | +| Used: leading(t1 t2 t3) | +| UnUsed: | +| SyntaxError: | ++--------------------------------------------------------------------------------+ +15 rows in set (0.10 sec) + ``` +### 右深树 +当我们想将计划的形状做成右深树或者bushy树或者zigzag树的时候,只需要加上大括号来限制plan的形状即可,不需要像oracle一样用swap从左深树一步步调整。 +```sql +mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; ++-----------------------------------------------+ +| Explain String | ++-----------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN](t1.c1 = t2.c2) | +| --------PhysicalOlapScan[t1] | +| --------PhysicalDistribute | +| ----------hashJoin[INNER_JOIN](t2.c2 = t3.c3) | +| ------------PhysicalOlapScan[t2] | +| ------------PhysicalDistribute | +| --------------PhysicalOlapScan[t3] | +| | +| Used: leading(t1 { t2 t3 }) | +| UnUsed: | +| SyntaxError: | ++-----------------------------------------------+ +14 rows in set (0.02 sec) + ``` +### Bushy 树 +```sql +mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; ++-----------------------------------------------+ +| Explain String | ++-----------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN](t2.c2 = t3.c3) | +| --------hashJoin[INNER_JOIN](t1.c1 = t2.c2) | +| ----------PhysicalOlapScan[t1] | +| ----------PhysicalDistribute | +| ------------PhysicalOlapScan[t2] | +| --------PhysicalDistribute | +| ----------hashJoin[INNER_JOIN](t3.c3 = t4.c4) | +| ------------PhysicalOlapScan[t3] | +| ------------PhysicalDistribute | +| --------------PhysicalOlapScan[t4] | +| | +| Used: leading({ t1 t2 } { t3 t4 }) | +| UnUsed: | +| SyntaxError: | ++-----------------------------------------------+ +17 rows in set (0.02 sec) + ``` +### zig-zag 树 +```sql +mysql> explain shape plan select /*+ leading(t1 {t2 t3} t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; ++--------------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++--------------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t3.c3 = t4.c4)) otherCondition=() | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| ------------PhysicalOlapScan[t1] | +| ------------PhysicalDistribute[DistributionSpecHash] | +| --------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | +| ----------------PhysicalOlapScan[t2] | +| ----------------PhysicalDistribute[DistributionSpecHash] | +| ------------------PhysicalOlapScan[t3] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------PhysicalOlapScan[t4] | +| | +| Hint log: | +| Used: leading(t1 { t2 t3 } t4) | +| UnUsed: | +| SyntaxError: | ++--------------------------------------------------------------------------------------+ +19 rows in set (0.02 sec) + ``` +## Non-inner join: +当遇到非inner-join的时候,例如Outer join或者semi/anti join的时候,leading hint会根据原始sql语义自动推导各个join的join方式。若遇到与原始sql语义不同的leading hint或者生成不了的情况则会放到unused里面,但是不影响计划正常流程的生成。 +下面是不能交换的例子: +-------- test outer join which can not swap +-- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) +```sql +mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; ++--------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++--------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | +| --------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| ----------PhysicalOlapScan[t1] | +| ----------PhysicalDistribute[DistributionSpecHash] | +| ------------PhysicalOlapScan[t2] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------PhysicalOlapScan[t3] | +| | +| Hint log: | +| Used: | +| UnUsed: leading(t1 { t2 t3 }) | +| SyntaxError: | ++--------------------------------------------------------------------------------+ +15 rows in set (0.01 sec) + ``` +下面是一些可以交换的例子和不能交换的例子,读者可自行验证 +```sql +-------- test outer join which can swap +-- (t1 leftjoin t2 on (P12)) innerjoin t3 on (P13) = (t1 innerjoin t3 on (P13)) leftjoin t2 on (P12) +explain shape plan select * from t1 left join t2 on c1 = c2 join t3 on c1 = c3; +explain shape plan select /*+ leading(t1 t3 t2) */ * from t1 left join t2 on c1 = c2 join t3 on c1 = c3; + +-- (t1 leftjoin t2 on (P12)) leftjoin t3 on (P13) = (t1 leftjoin t3 on (P13)) leftjoin t2 on (P12) +explain shape plan select * from t1 left join t2 on c1 = c2 left join t3 on c1 = c3; +explain shape plan select /*+ leading(t1 t3 t2) */ * from t1 left join t2 on c1 = c2 left join t3 on c1 = c3; + +-- (t1 leftjoin t2 on (P12)) leftjoin t3 on (P23) = t1 leftjoin (t2 leftjoin t3 on (P23)) on (P12) +select /*+ leading(t2 t3 t1) SWAP_INPUT(t1) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; +explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; +explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; + +-------- test outer join which can not swap +-- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) +-- eliminated to inner join +explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; +explain graph select /*+ leading(t1 t2 t3) */ * from t1 left join (select * from t2 join t3 on c2 = c3) on c1 = c2; + +-- test semi join +explain shape plan select * from t1 where c1 in (select c2 from t2); +explain shape plan select /*+ leading(t2 t1) */ * from t1 where c1 in (select c2 from t2); + +-- test anti join +explain shape plan select * from t1 where exists (select c2 from t2); +``` +## View +遇到别名的情况,可以将别名作为一个完整的子树进行指定,子树里面的joinOrder由文本序生成。 +```sql +mysql> explain shape plan select /*+ leading(alias t1) */ count(*) from t1 join (select c2 from t2 join t3 on t2.c2 = t3.c3) as alias on t1.c1 = alias.c2; ++--------------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++--------------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --hashAgg[GLOBAL] | +| ----PhysicalDistribute[DistributionSpecGather] | +| ------hashAgg[LOCAL] | +| --------PhysicalProject | +| ----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = alias.c2)) otherCondition=() | +| ------------PhysicalProject | +| --------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | +| ----------------PhysicalProject | +| ------------------PhysicalOlapScan[t2] | +| ----------------PhysicalDistribute[DistributionSpecHash] | +| ------------------PhysicalProject | +| --------------------PhysicalOlapScan[t3] | +| ------------PhysicalDistribute[DistributionSpecHash] | +| --------------PhysicalProject | +| ----------------PhysicalOlapScan[t1] | +| | +| Hint log: | +| Used: leading(alias t1) | +| UnUsed: | +| SyntaxError: | ++--------------------------------------------------------------------------------------+ +21 rows in set (0.02 sec) + ``` +## 与ordered混合使用 +当与ordered hint混合使用的时候以ordered hint为主,即ordered hint生效优先级高于leading hint。例: +```sql +mysql> explain shape plan select /*+ ORDERED LEADING(t1 t2 t3) */ t1.c1 from t2 join t1 on t1.c1 = t2.c2 join t3 on c2 = c3; ++--------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++--------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | +| --------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| ----------PhysicalProject | +| ------------PhysicalOlapScan[t2] | +| ----------PhysicalDistribute[DistributionSpecHash] | +| ------------PhysicalProject | +| --------------PhysicalOlapScan[t1] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------PhysicalProject | +| ------------PhysicalOlapScan[t3] | +| | +| Hint log: | +| Used: ORDERED | +| UnUsed: leading(t1 t2 t3) | +| SyntaxError: | ++--------------------------------------------------------------------------------+ +18 rows in set (0.02 sec) + ``` +## 使用限制 +- 当前版本只支持使用一个leadingHint。若和子查询同时使用leadinghint的话则查询会报错。例(这个例子explain会报错,但是会走正常的路径生成计划): +```sql +mysql> explain shape plan select /*+ leading(alias t1) */ count(*) from t1 join (select /*+ leading(t3 t2) */ c2 from t2 join t3 on t2.c2 = t3.c3) as alias on t1.c1 = alias.c2; + +----------------------------------------------------------------------------------------+ + | Explain String(Nereids Planner) | + +----------------------------------------------------------------------------------------+ + | PhysicalResultSink | + | --hashAgg[GLOBAL] | + | ----PhysicalDistribute[DistributionSpecGather] | + | ------hashAgg[LOCAL] | + | --------PhysicalProject | + | ----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = alias.c2)) otherCondition=() | + | ------------PhysicalProject | + | --------------PhysicalOlapScan[t1] | + | ------------PhysicalDistribute[DistributionSpecHash] | + | --------------PhysicalProject | + | ----------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | + | ------------------PhysicalProject | + | --------------------PhysicalOlapScan[t2] | + | ------------------PhysicalDistribute[DistributionSpecHash] | + | --------------------PhysicalProject | + | ----------------------PhysicalOlapScan[t3] | + | | + | Hint log: | + | Used: | + | UnUsed: leading(alias t1) | + | SyntaxError: leading(t3 t2) Msg:one query block can only have one leading clause | + +----------------------------------------------------------------------------------------+ + 21 rows in set (0.01 sec) +``` + # OrderedHint 使用说明 +- 使用ordered hint会让join tree的形状固定下来,按照文本序来显示 +- 语法为 /*+ ORDERED */,leading由"/*+"和"*/"包围并置于select语句里面 select的正后方,例: + explain shape plan select /*+ ORDERED */ t1.c1 from t2 join t1 on t1.c1 = t2.c2 join t3 on c2 = c3; + join + / \ + join t3 + / \ + t2 t1 + +```sql +mysql> explain shape plan select /*+ ORDERED */ t1.c1 from t2 join t1 on t1.c1 = t2.c2 join t3 on c2 = c3; ++--------------------------------------------------------------------------------+ +| Explain String(Nereids Planner) | ++--------------------------------------------------------------------------------+ +| PhysicalResultSink | +| --PhysicalDistribute[DistributionSpecGather] | +| ----PhysicalProject | +| ------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | +| --------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | +| ----------PhysicalProject | +| ------------PhysicalOlapScan[t2] | +| ----------PhysicalDistribute[DistributionSpecHash] | +| ------------PhysicalProject | +| --------------PhysicalOlapScan[t1] | +| --------PhysicalDistribute[DistributionSpecHash] | +| ----------PhysicalProject | +| ------------PhysicalOlapScan[t3] | +| | +| Hint log: | +| Used: ORDERED | +| UnUsed: | +| SyntaxError: | ++--------------------------------------------------------------------------------+ +18 rows in set (0.02 sec) + ``` +- 当ordered hint和leading hint同时使用时以ordered hint为准,leading hint会失效 +```sql +mysql> explain shape plan select /*+ ORDERED LEADING(t1 t2 t3) */ t1.c1 from t2 join t1 on t1.c1 = t2.c2 join t3 on c2 = c3; + +--------------------------------------------------------------------------------+ + | Explain String(Nereids Planner) | + +--------------------------------------------------------------------------------+ + | PhysicalResultSink | + | --PhysicalDistribute[DistributionSpecGather] | + | ----PhysicalProject | + | ------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() | + | --------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | + | ----------PhysicalProject | + | ------------PhysicalOlapScan[t2] | + | ----------PhysicalDistribute[DistributionSpecHash] | + | ------------PhysicalProject | + | --------------PhysicalOlapScan[t1] | + | --------PhysicalDistribute[DistributionSpecHash] | + | ----------PhysicalProject | + | ------------PhysicalOlapScan[t3] | + | | + | Hint log: | + | Used: ORDERED | + | UnUsed: leading(t1 t2 t3) | + | SyntaxError: | + +--------------------------------------------------------------------------------+ + 18 rows in set (0.02 sec) + ``` +# DistributeHint 使用说明 +- 目前只能指定右表的distribute Type 而且只有[shuffle] 和 [broadcast]两种,写在join右表前面且允许中括号和/*+ */两种写法 +- 目前能使用任意个DistributeHint +- 当遇到无法正确生成计划的 DistributeHint,没有显示,按最大努力生效,最后以explain显示的distribute方式为主 +- 当前版本暂不与leading混用,且当distribute指定的表位于join右边才可生效。 +- 多与ordered混用,利用文本序把join顺序固定下来,然后再指定相应的join里面我们预期使用什么样的distribute方式。例: + 使用前: +```sql +mysql> explain shape plan select count(*) from t1 join t2 on t1.c1 = t2.c2; + +----------------------------------------------------------------------------------+ + | Explain String(Nereids Planner) | + +----------------------------------------------------------------------------------+ + | PhysicalResultSink | + | --hashAgg[GLOBAL] | + | ----PhysicalDistribute[DistributionSpecGather] | + | ------hashAgg[LOCAL] | + | --------PhysicalProject | + | ----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | + | ------------PhysicalProject | + | --------------PhysicalOlapScan[t1] | + | ------------PhysicalDistribute[DistributionSpecHash] | + | --------------PhysicalProject | + | ----------------PhysicalOlapScan[t2] | + +----------------------------------------------------------------------------------+ + 11 rows in set (0.01 sec) + ``` + + 使用后: + ```sql +mysql> explain shape plan select /*+ ordered */ count(*) from t2 join[broadcast] t1 on t1.c1 = t2.c2; + +----------------------------------------------------------------------------------+ + | Explain String(Nereids Planner) | + +----------------------------------------------------------------------------------+ + | PhysicalResultSink | + | --hashAgg[GLOBAL] | + | ----PhysicalDistribute[DistributionSpecGather] | + | ------hashAgg[LOCAL] | + | --------PhysicalProject | + | ----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() | + | ------------PhysicalProject | + | --------------PhysicalOlapScan[t2] | + | ------------PhysicalDistribute[DistributionSpecReplicated] | + | --------------PhysicalProject | + | ----------------PhysicalOlapScan[t1] | + | | + | Hint log: | + | Used: ORDERED | + | UnUsed: | + | SyntaxError: | + +----------------------------------------------------------------------------------+ + 16 rows in set (0.01 sec) + ``` +- Explain shape plan里面会显示distribute算子相关的信息,其中DistributionSpecReplicated表示该算子将对应的数据变成所有be节点复制一份,DistributionSpecGather表示将数据gather到fe节点,DistributionSpecHash表示将数据按照特定的hashKey以及算法打散到不同的be节点。 +# 待支持 +- leadingHint待支持子查询解嵌套指定,当前和子查询提升以后不能混用,需要有hint来控制是否可以解嵌套 +- 需要新的distributeHint来更好且更全面地控制distribute算子 +- 混合使用leadingHint与distributeHint来共同确定join的形状 diff --git a/docs/zh-CN/docs/sql-manual/sql-reference/Data-Manipulation-Statements/Manipulation/SELECT.md b/docs/zh-CN/docs/sql-manual/sql-reference/Data-Manipulation-Statements/Manipulation/SELECT.md index 7c11caf93b..cdabcf9e55 100644 --- a/docs/zh-CN/docs/sql-manual/sql-reference/Data-Manipulation-Statements/Manipulation/SELECT.md +++ b/docs/zh-CN/docs/sql-manual/sql-reference/Data-Manipulation-Statements/Manipulation/SELECT.md @@ -39,6 +39,7 @@ SELECT ```sql SELECT + [hint_statement, ...] [ALL | DISTINCT | DISTINCTROW | ALL EXCEPT ( col_name1 [, col_name2, col_name3, ...] )] select_expr [, select_expr ...] [FROM table_references @@ -87,6 +88,8 @@ SELECT 12. `[TABLET tids] TABLESAMPLE n [ROWS | PERCENT] [REPEATABLE seek]`: 在FROM子句中限制表的读取行数,根据指定的行数或百分比从表中伪随机的选择数个Tablet,REPEATABLE指定种子数可使选择的样本再次返回,此外也可手动指定TableID,注意这只能用于OLAP表。 +13. `hint_statement`: 在selectlist前面使用hint表示可以通过hint去影响优化器的行为以期得到想要的执行计划,详情可参考[joinHint 使用文档](https://doris.apache.org/zh-CN/docs/query-acceleration/hint/joinHint.md) + **语法约束:** 1. SELECT也可用于检索计算的行而不引用任何表。 diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java index 4bcded3bc1..e093b4859c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java @@ -27,6 +27,7 @@ import org.apache.doris.nereids.analyzer.UnboundOlapTableSink; import org.apache.doris.nereids.analyzer.UnboundOneRowRelation; import org.apache.doris.nereids.analyzer.UnboundRelation; import org.apache.doris.nereids.exceptions.AnalysisException; +import org.apache.doris.nereids.hint.Hint; import org.apache.doris.nereids.jobs.Job; import org.apache.doris.nereids.jobs.JobContext; import org.apache.doris.nereids.jobs.executor.Analyzer; @@ -114,6 +115,9 @@ public class CascadesContext implements ScheduleContext { private final Optional parent; private final List materializationContexts; + private boolean isLeadingJoin = false; + + private final Map hintMap = Maps.newLinkedHashMap(); /** * Constructor of OptimizerContext. @@ -615,4 +619,16 @@ public class CascadesContext implements ScheduleContext { p.value().setStatistics(updatedConsumerStats); } } + + public boolean isLeadingJoin() { + return isLeadingJoin; + } + + public void setLeadingJoin(boolean leadingJoin) { + isLeadingJoin = leadingJoin; + } + + public Map getHintMap() { + return hintMap; + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java index d50d2d445c..6d9fa37359 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java @@ -68,7 +68,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; @@ -353,30 +352,30 @@ public class NereidsPlanner extends Planner { /** * getting hints explain string, which specified by enumerate and show in lists - * @param hintMap hint map recorded in statement context + * @param hints hint map recorded in statement context * @return explain string shows using of hint */ - public String getHintExplainString(Map hintMap) { + public String getHintExplainString(List hints) { String used = ""; String unUsed = ""; String syntaxError = ""; - for (Map.Entry entry : hintMap.entrySet()) { - switch (entry.getValue().getStatus()) { + for (Hint hint : hints) { + switch (hint.getStatus()) { case UNUSED: - unUsed = unUsed + " " + entry.getValue().getExplainString(); + unUsed = unUsed + " " + hint.getExplainString(); break; case SYNTAX_ERROR: - syntaxError = syntaxError + " " + entry.getValue().getExplainString() - + " Msg:" + entry.getValue().getErrorMessage(); + syntaxError = syntaxError + " " + hint.getExplainString() + + " Msg:" + hint.getErrorMessage(); break; case SUCCESS: - used = used + " " + entry.getValue().getExplainString(); + used = used + " " + hint.getExplainString(); break; default: break; } } - return "\nUsed:" + used + "\nUnUsed:" + unUsed + "\nSyntaxError:" + syntaxError; + return "\nHint log:" + "\nUsed:" + used + "\nUnUsed:" + unUsed + "\nSyntaxError:" + syntaxError; } @Override @@ -417,8 +416,8 @@ public class NereidsPlanner extends Planner { default: plan = super.getExplainString(explainOptions); } - if (!statementContext.getHintMap().isEmpty()) { - String hint = getHintExplainString(cascadesContext.getStatementContext().getHintMap()); + if (statementContext != null && !statementContext.getHints().isEmpty()) { + String hint = getHintExplainString(statementContext.getHints()); return plan + hint; } return plan; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java index 16ad3bc0bd..da81698a8b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java @@ -42,6 +42,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -72,8 +73,6 @@ public class StatementContext { private boolean isDpHyp = false; private boolean isOtherJoinReorder = false; - private boolean isLeadingJoin = false; - private final IdGenerator exprIdGenerator = ExprId.createGenerator(); private final IdGenerator objectIdGenerator = ObjectId.createGenerator(); private final IdGenerator relationIdGenerator = RelationId.createGenerator(); @@ -87,9 +86,10 @@ public class StatementContext { private final Map, Group>>> cteIdToConsumerGroup = new HashMap<>(); private final Map rewrittenCteProducer = new HashMap<>(); private final Map rewrittenCteConsumer = new HashMap<>(); - private final Map hintMap = Maps.newLinkedHashMap(); private final Set viewDdlSqlSet = Sets.newHashSet(); + private final List hints = new ArrayList<>(); + public StatementContext() { this.connectContext = ConnectContext.get(); } @@ -147,14 +147,6 @@ public class StatementContext { isDpHyp = dpHyp; } - public boolean isLeadingJoin() { - return isLeadingJoin; - } - - public void setLeadingJoin(boolean leadingJoin) { - isLeadingJoin = leadingJoin; - } - public boolean isOtherJoinReorder() { return isOtherJoinReorder; } @@ -193,10 +185,6 @@ public class StatementContext { return supplier.get(); } - public Map getHintMap() { - return hintMap; - } - public ColumnAliasGenerator getColumnAliasGenerator() { return columnAliasGenerator == null ? columnAliasGenerator = new ColumnAliasGenerator() @@ -246,4 +234,12 @@ public class StatementContext { public List getViewDdlSqls() { return ImmutableList.copyOf(viewDdlSqlSet); } + + public void addHint(Hint hint) { + this.hints.add(hint); + } + + public List getHints() { + return ImmutableList.copyOf(hints); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/hint/LeadingHint.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/hint/LeadingHint.java index c063c08a32..97af2e2622 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/hint/LeadingHint.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/hint/LeadingHint.java @@ -31,6 +31,7 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; import org.apache.doris.nereids.trees.plans.logical.LogicalProject; import org.apache.doris.nereids.trees.plans.logical.LogicalRelation; +import org.apache.doris.nereids.trees.plans.logical.LogicalSubQueryAlias; import org.apache.doris.nereids.util.JoinUtils; import com.google.common.collect.Maps; @@ -61,10 +62,14 @@ public class LeadingHint extends Hint { private final List> filters = new ArrayList<>(); + private final Map conditionJoinType = Maps.newLinkedHashMap(); + private final List joinConstraintList = new ArrayList<>(); private Long innerJoinBitmap = 0L; + private Long totalBitmap = 0L; + public LeadingHint(String hintName) { super(hintName); } @@ -191,6 +196,30 @@ public class LeadingHint extends Hint { return filters; } + public void putConditionJoinType(Expression filter, JoinType joinType) { + conditionJoinType.put(filter, joinType); + } + + /** + * find out whether conditions can match original joinType + * @param conditions conditions needs to put on this join + * @param joinType join type computed by join constraint + * @return can conditions matched + */ + public boolean isConditionJoinTypeMatched(List conditions, JoinType joinType) { + for (Expression condition : conditions) { + JoinType originalJoinType = conditionJoinType.get(condition); + if (originalJoinType.equals(joinType) + || originalJoinType.isOneSideOuterJoin() && joinType.isOneSideOuterJoin() + || originalJoinType.isSemiJoin() && joinType.isSemiJoin() + || originalJoinType.isAntiJoin() && joinType.isAntiJoin()) { + continue; + } + return false; + } + return true; + } + public List getJoinConstraintList() { return joinConstraintList; } @@ -203,6 +232,31 @@ public class LeadingHint extends Hint { this.innerJoinBitmap = innerJoinBitmap; } + public Long getTotalBitmap() { + return totalBitmap; + } + + /** + * set total bitmap used in leading before we get into leading join + */ + public void setTotalBitmap() { + Long totalBitmap = 0L; + if (hasSameName()) { + this.setStatus(HintStatus.SYNTAX_ERROR); + this.setErrorMessage("duplicated table"); + } + for (int index = 0; index < getTablelist().size(); index++) { + RelationId id = findRelationIdAndTableName(getTablelist().get(index)); + if (id == null) { + this.setStatus(HintStatus.SYNTAX_ERROR); + this.setErrorMessage("can not find table: " + getTablelist().get(index)); + return; + } + totalBitmap = LongBitmap.set(totalBitmap, id.asInt()); + } + this.totalBitmap = totalBitmap; + } + /** * try to get join constraint, if can not get, it means join is inner join, * @param joinTableBitmap table bitmap below this join @@ -218,6 +272,22 @@ public class LeadingHint extends Hint { JoinConstraint matchedJoinConstraint = null; for (JoinConstraint joinConstraint : joinConstraintList) { + if (joinConstraint.getJoinType().isFullOuterJoin()) { + if (leftTableBitmap.equals(joinConstraint.getLeftHand()) + && rightTableBitmap.equals(joinConstraint.getRightHand()) + || rightTableBitmap.equals(joinConstraint.getLeftHand()) + && leftTableBitmap.equals(joinConstraint.getRightHand())) { + if (matchedJoinConstraint != null) { + return Pair.of(null, false); + } + matchedJoinConstraint = joinConstraint; + reversed = false; + break; + } else { + continue; + } + } + if (!LongBitmap.isOverlap(joinConstraint.getMinRightHand(), joinTableBitmap)) { continue; } @@ -337,7 +407,6 @@ public class LeadingHint extends Hint { * @return plan */ public Plan generateLeadingJoinPlan() { - this.setStatus(HintStatus.SUCCESS); Stack> stack = new Stack<>(); int index = 0; LogicalPlan logicalPlan = getLogicalPlanByName(getTablelist().get(index)); @@ -365,8 +434,16 @@ public class LeadingHint extends Hint { getFilters(), newStackTop.second, logicalPlan); Pair, List> pair = JoinUtils.extractExpressionForHashTable( newStackTop.second.getOutput(), logicalPlan.getOutput(), conditions); + // leading hint would set status inside if not success JoinType joinType = computeJoinType(getBitmap(newStackTop.second), getBitmap(logicalPlan), conditions); + if (joinType == null) { + this.setStatus(HintStatus.SYNTAX_ERROR); + this.setErrorMessage("JoinType can not be null"); + } else if (!isConditionJoinTypeMatched(conditions, joinType)) { + this.setStatus(HintStatus.UNUSED); + this.setErrorMessage("condition does not matched joinType"); + } if (!this.isSuccess()) { return null; } @@ -379,7 +456,13 @@ public class LeadingHint extends Hint { logicalPlan); logicalJoin.setBitmap(LongBitmap.or(getBitmap(newStackTop.second), getBitmap(logicalPlan))); if (stackTopLevel > 0) { - stackTopLevel--; + if (index < getTablelist().size()) { + if (stackTopLevel > getLevellist().get(index)) { + stackTopLevel--; + } + } else { + stackTopLevel--; + } } if (!stack.isEmpty()) { newStackTop = stack.peek(); @@ -401,17 +484,7 @@ public class LeadingHint extends Hint { LogicalJoin finalJoin = (LogicalJoin) stack.pop().second; // we want all filters been remove - if (!getFilters().isEmpty()) { - List conditions = getLastConditions(getFilters()); - Pair, List> pair = JoinUtils.extractExpressionForHashTable( - finalJoin.left().getOutput(), finalJoin.right().getOutput(), conditions); - finalJoin = new LogicalJoin<>(finalJoin.getJoinType(), pair.first, - pair.second, - JoinHint.NONE, - Optional.empty(), - finalJoin.left(), - finalJoin.right()); - } + assert (filters.isEmpty()); if (finalJoin != null) { this.setStatus(HintStatus.SUCCESS); } @@ -468,6 +541,8 @@ public class LeadingHint extends Hint { return getBitmap((LogicalPlan) root.child(0)); } else if (root instanceof LogicalProject) { return getBitmap((LogicalPlan) root.child(0)); + } else if (root instanceof LogicalSubQueryAlias) { + return LongBitmap.set(0L, (((LogicalSubQueryAlias) root).getRelationId().asInt())); } else { return null; } @@ -484,11 +559,6 @@ public class LeadingHint extends Hint { this.setErrorMessage("duplicated table"); return totalBitmap; } - if (tables != null && getTablelist().size() != tables.size()) { - this.setStatus(HintStatus.SYNTAX_ERROR); - this.setErrorMessage("tables should be same as join tables"); - return totalBitmap; - } for (int index = 0; index < getTablelist().size(); index++) { RelationId id = findRelationIdAndTableName(getTablelist().get(index)); if (id == null) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/hint/OrderedHint.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/hint/OrderedHint.java new file mode 100644 index 0000000000..b1a37f41fd --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/hint/OrderedHint.java @@ -0,0 +1,35 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.nereids.hint; + +/** + * ordered hint. + */ +public class OrderedHint extends Hint { + + public OrderedHint(String hintName) { + super(hintName); + } + + @Override + public String getExplainString() { + StringBuilder out = new StringBuilder(); + out.append("ORDERED"); + return out.toString(); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Analyzer.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Analyzer.java index e773ed41f6..b78cb09360 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Analyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Analyzer.java @@ -19,8 +19,6 @@ package org.apache.doris.nereids.jobs.executor; import org.apache.doris.nereids.CascadesContext; import org.apache.doris.nereids.jobs.rewrite.RewriteJob; -import org.apache.doris.nereids.processor.pre.EliminateLogicalSelectHint; -import org.apache.doris.nereids.rules.RuleType; import org.apache.doris.nereids.rules.analysis.AdjustAggregateNullableForEmptySet; import org.apache.doris.nereids.rules.analysis.AnalyzeCTE; import org.apache.doris.nereids.rules.analysis.BindExpression; @@ -30,8 +28,12 @@ import org.apache.doris.nereids.rules.analysis.BindSink; import org.apache.doris.nereids.rules.analysis.CheckAfterBind; import org.apache.doris.nereids.rules.analysis.CheckAnalysis; import org.apache.doris.nereids.rules.analysis.CheckPolicy; +import org.apache.doris.nereids.rules.analysis.CollectJoinConstraint; +import org.apache.doris.nereids.rules.analysis.CollectSubQueryAlias; import org.apache.doris.nereids.rules.analysis.EliminateGroupByConstant; +import org.apache.doris.nereids.rules.analysis.EliminateLogicalSelectHint; import org.apache.doris.nereids.rules.analysis.FillUpMissingSlots; +import org.apache.doris.nereids.rules.analysis.LeadingJoin; import org.apache.doris.nereids.rules.analysis.NormalizeAggregate; import org.apache.doris.nereids.rules.analysis.NormalizeRepeat; import org.apache.doris.nereids.rules.analysis.OneRowRelationExtractAggregate; @@ -41,6 +43,7 @@ import org.apache.doris.nereids.rules.analysis.ReplaceExpressionByChildOutput; import org.apache.doris.nereids.rules.analysis.ResolveOrdinalInOrderByAndGroupBy; import org.apache.doris.nereids.rules.analysis.SubqueryToApply; import org.apache.doris.nereids.rules.analysis.UserAuthentication; +import org.apache.doris.nereids.rules.rewrite.JoinCommute; import java.util.List; import java.util.Objects; @@ -84,9 +87,9 @@ public class Analyzer extends AbstractBatchJobExecutor { private static List buildAnalyzeJobs(Optional customTableResolver) { return jobs( - // we should eliminate hint after "Subquery unnesting" because some hint maybe exist in the CTE or subquery. - custom(RuleType.ELIMINATE_HINT, EliminateLogicalSelectHint::new), + // we should eliminate hint before "Subquery unnesting". topDown(new AnalyzeCTE()), + topDown(new EliminateLogicalSelectHint()), bottomUp( new BindRelation(customTableResolver), new CheckPolicy(), @@ -121,6 +124,12 @@ public class Analyzer extends AbstractBatchJobExecutor { bottomUp(new CheckAnalysis()), topDown(new EliminateGroupByConstant()), topDown(new NormalizeAggregate()), + bottomUp(new JoinCommute()), + bottomUp( + new CollectSubQueryAlias(), + new CollectJoinConstraint() + ), + topDown(new LeadingJoin()), bottomUp(new SubqueryToApply()) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java index ee6d19b315..e523fc5163 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java @@ -43,7 +43,6 @@ import org.apache.doris.nereids.rules.rewrite.CheckDataTypes; import org.apache.doris.nereids.rules.rewrite.CheckMatchExpression; import org.apache.doris.nereids.rules.rewrite.CheckMultiDistinct; import org.apache.doris.nereids.rules.rewrite.CollectFilterAboveConsumer; -import org.apache.doris.nereids.rules.rewrite.CollectJoinConstraint; import org.apache.doris.nereids.rules.rewrite.CollectProjectAboveConsumer; import org.apache.doris.nereids.rules.rewrite.ColumnPruning; import org.apache.doris.nereids.rules.rewrite.ConvertInnerOrCrossJoin; @@ -74,7 +73,7 @@ import org.apache.doris.nereids.rules.rewrite.InferFilterNotNull; import org.apache.doris.nereids.rules.rewrite.InferJoinNotNull; import org.apache.doris.nereids.rules.rewrite.InferPredicates; import org.apache.doris.nereids.rules.rewrite.InferSetOperatorDistinct; -import org.apache.doris.nereids.rules.rewrite.LeadingJoin; +import org.apache.doris.nereids.rules.rewrite.JoinCommute; import org.apache.doris.nereids.rules.rewrite.LimitSortToTopN; import org.apache.doris.nereids.rules.rewrite.MergeFilters; import org.apache.doris.nereids.rules.rewrite.MergeOneRowRelationIntoUnion; @@ -106,7 +105,6 @@ import org.apache.doris.nereids.rules.rewrite.PushProjectIntoOneRowRelation; import org.apache.doris.nereids.rules.rewrite.PushProjectThroughUnion; import org.apache.doris.nereids.rules.rewrite.ReorderJoin; import org.apache.doris.nereids.rules.rewrite.RewriteCteChildren; -import org.apache.doris.nereids.rules.rewrite.SemiJoinCommute; import org.apache.doris.nereids.rules.rewrite.SimplifyAggGroupBy; import org.apache.doris.nereids.rules.rewrite.SplitLimit; import org.apache.doris.nereids.rules.rewrite.TransposeSemiJoinAgg; @@ -226,7 +224,7 @@ public class Rewriter extends AbstractBatchJobExecutor { ), // push down SEMI Join bottomUp( - new SemiJoinCommute(), + new JoinCommute(), new TransposeSemiJoinLogicalJoin(), new TransposeSemiJoinLogicalJoinProject(), new TransposeSemiJoinAgg(), @@ -240,15 +238,6 @@ public class Rewriter extends AbstractBatchJobExecutor { bottomUp(new EliminateNotNull()), topDown(new ConvertInnerOrCrossJoin()) ), - topic("LEADING JOIN", - bottomUp( - new CollectJoinConstraint() - ), - custom(RuleType.LEADING_JOIN, LeadingJoin::new), - bottomUp( - new ExpressionRewrite(CheckLegalityAfterRewrite.INSTANCE) - ) - ), topic("Column pruning and infer predicate", custom(RuleType.COLUMN_PRUNING, ColumnPruning::new), custom(RuleType.INFER_PREDICATES, InferPredicates::new), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/bitmap/LongBitmap.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/bitmap/LongBitmap.java index 58529dc41d..c50509b238 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/bitmap/LongBitmap.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/bitmap/LongBitmap.java @@ -150,9 +150,17 @@ public class LongBitmap { return Long.numberOfTrailingZeros(bitmap); } + /** + * use to calculate table bitmap + * @param relationIdSet relationIds + * @return bitmap + */ public static Long computeTableBitmap(Set relationIdSet) { Long totalBitmap = 0L; for (RelationId id : relationIdSet) { + if (id == null) { + continue; + } totalBitmap = LongBitmap.set(totalBitmap, (id.asInt())); } return totalBitmap; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java index 9a8fe4bba2..1a18d0d487 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java @@ -193,6 +193,7 @@ import org.apache.doris.nereids.exceptions.ParseException; import org.apache.doris.nereids.properties.OrderKey; import org.apache.doris.nereids.properties.SelectHint; import org.apache.doris.nereids.properties.SelectHintLeading; +import org.apache.doris.nereids.properties.SelectHintOrdered; import org.apache.doris.nereids.properties.SelectHintSetVar; import org.apache.doris.nereids.trees.TableSample; import org.apache.doris.nereids.trees.expressions.Add; @@ -2556,6 +2557,9 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor { } hints.put(hintName, new SelectHintLeading(hintName, leadingParameters)); break; + case "ordered": + hints.put(hintName, new SelectHintOrdered(hintName)); + break; default: break; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/pre/PlanPreprocessors.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/pre/PlanPreprocessors.java index 108d52d430..9dfc12b2c1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/pre/PlanPreprocessors.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/pre/PlanPreprocessors.java @@ -46,7 +46,6 @@ public class PlanPreprocessors { public List getProcessors() { // add processor if we need return ImmutableList.of( - new EliminateLogicalSelectHint(), new TurnOffPipelineForDml() ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/SelectHintOrdered.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/SelectHintOrdered.java new file mode 100644 index 0000000000..2a8972785b --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/SelectHintOrdered.java @@ -0,0 +1,32 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.nereids.properties; + +/** + * select hint. + */ +public class SelectHintOrdered extends SelectHint { + public SelectHintOrdered(String hintName) { + super(hintName); + } + + @Override + public String toString() { + return super.getHintName(); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java index 172862f679..09e01136d8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java @@ -108,7 +108,10 @@ public enum RuleType { SIMPLIFY_AGG_GROUP_BY(RuleTypeClass.REWRITE), DISTINCT_AGGREGATE_DISASSEMBLE(RuleTypeClass.REWRITE), LOGICAL_SUB_QUERY_ALIAS_TO_LOGICAL_PROJECT(RuleTypeClass.REWRITE), + COLLECT_SUB_QUERY_ALIAS(RuleTypeClass.REWRITE), ELIMINATE_GROUP_BY_CONSTANT(RuleTypeClass.REWRITE), + + ELIMINATE_LOGICAL_SELECT_HINT(RuleTypeClass.REWRITE), ELIMINATE_ORDER_BY_CONSTANT(RuleTypeClass.REWRITE), ELIMINATE_HINT(RuleTypeClass.REWRITE), ELIMINATE_JOIN_ON_EMPTYRELATION(RuleTypeClass.REWRITE), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java index 689763b6f7..78cde515fc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java @@ -128,9 +128,8 @@ public class BindRelation extends OneAnalysisRuleFactory { if (analyzedCte.isPresent()) { LogicalCTEConsumer consumer = new LogicalCTEConsumer(unboundRelation.getRelationId(), cteContext.getCteId(), tableName, analyzedCte.get()); - if (cascadesContext.getStatementContext().isLeadingJoin()) { - LeadingHint leading = (LeadingHint) cascadesContext.getStatementContext() - .getHintMap().get("Leading"); + if (cascadesContext.isLeadingJoin()) { + LeadingHint leading = (LeadingHint) cascadesContext.getHintMap().get("Leading"); leading.putRelationIdAndTableName(Pair.of(consumer.getRelationId(), tableName)); leading.getRelationIdToScanMap().put(consumer.getRelationId(), consumer); } @@ -156,8 +155,8 @@ public class BindRelation extends OneAnalysisRuleFactory { // TODO: should generate different Scan sub class according to table's type LogicalPlan scan = getLogicalPlan(table, unboundRelation, tableQualifier, cascadesContext); - if (cascadesContext.getStatementContext().isLeadingJoin()) { - LeadingHint leading = (LeadingHint) cascadesContext.getStatementContext().getHintMap().get("Leading"); + if (cascadesContext.isLeadingJoin()) { + LeadingHint leading = (LeadingHint) cascadesContext.getHintMap().get("Leading"); leading.putRelationIdAndTableName(Pair.of(unboundRelation.getRelationId(), tableName)); leading.getRelationIdToScanMap().put(unboundRelation.getRelationId(), scan); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/CollectJoinConstraint.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CollectJoinConstraint.java similarity index 82% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/CollectJoinConstraint.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CollectJoinConstraint.java index a977347a34..42bc6d1f9b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/CollectJoinConstraint.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CollectJoinConstraint.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.rules.rewrite; +package org.apache.doris.nereids.rules.analysis; import org.apache.doris.common.Pair; import org.apache.doris.nereids.hint.Hint; @@ -24,11 +24,11 @@ import org.apache.doris.nereids.hint.LeadingHint; import org.apache.doris.nereids.jobs.joinorder.hypergraph.bitmap.LongBitmap; import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; +import org.apache.doris.nereids.rules.rewrite.RewriteRuleFactory; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.Slot; import org.apache.doris.nereids.trees.plans.JoinType; import org.apache.doris.nereids.trees.plans.RelationId; -import org.apache.doris.nereids.trees.plans.logical.LogicalFilter; import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; import org.apache.doris.nereids.trees.plans.logical.LogicalProject; @@ -47,24 +47,17 @@ public class CollectJoinConstraint implements RewriteRuleFactory { @Override public List buildRules() { return ImmutableList.of( - logicalRelation().thenApply(ctx -> { - LeadingHint leading = (LeadingHint) ctx.cascadesContext - .getStatementContext().getHintMap().get("Leading"); - if (leading == null) { - return ctx.root; - } else if (leading.isSyntaxError()) { - return ctx.root; - } - return ctx.root; - }).toRule(RuleType.COLLECT_JOIN_CONSTRAINT), - logicalJoin().thenApply(ctx -> { - LeadingHint leading = (LeadingHint) ctx.cascadesContext - .getStatementContext().getHintMap().get("Leading"); - if (leading == null) { + if (!ctx.cascadesContext.isLeadingJoin()) { return ctx.root; } + LeadingHint leading = (LeadingHint) ctx.cascadesContext + .getHintMap().get("Leading"); LogicalJoin join = ctx.root; + if (join.getJoinType().isNullAwareLeftAntiJoin()) { + leading.setStatus(Hint.HintStatus.UNUSED); + leading.setErrorMessage("condition does not matched joinType"); + } List expressions = join.getHashJoinConjuncts(); Long totalFilterBitMap = 0L; Long nonNullableSlotBitMap = 0L; @@ -74,6 +67,7 @@ public class CollectJoinConstraint implements RewriteRuleFactory { Long filterBitMap = calSlotsTableBitMap(leading, expression.getInputSlots(), false); totalFilterBitMap = LongBitmap.or(totalFilterBitMap, filterBitMap); leading.getFilters().add(Pair.of(filterBitMap, expression)); + leading.putConditionJoinType(expression, join.getJoinType()); } expressions = join.getOtherJoinConjuncts(); for (Expression expression : expressions) { @@ -82,6 +76,7 @@ public class CollectJoinConstraint implements RewriteRuleFactory { Long filterBitMap = calSlotsTableBitMap(leading, expression.getInputSlots(), false); totalFilterBitMap = LongBitmap.or(totalFilterBitMap, filterBitMap); leading.getFilters().add(Pair.of(filterBitMap, expression)); + leading.putConditionJoinType(expression, join.getJoinType()); } Long leftHand = LongBitmap.computeTableBitmap(join.left().getInputRelations()); Long rightHand = LongBitmap.computeTableBitmap(join.right().getInputRelations()); @@ -91,28 +86,13 @@ public class CollectJoinConstraint implements RewriteRuleFactory { return ctx.root; }).toRule(RuleType.COLLECT_JOIN_CONSTRAINT), - logicalFilter().thenApply(ctx -> { - LeadingHint leading = (LeadingHint) ctx.cascadesContext - .getStatementContext().getHintMap().get("Leading"); - if (leading == null) { - return ctx.root; - } - LogicalFilter filter = ctx.root; - Set expressions = filter.getConjuncts(); - for (Expression expression : expressions) { - Long filterBitMap = calSlotsTableBitMap(leading, expression.getInputSlots(), false); - leading.getFilters().add(Pair.of(filterBitMap, expression)); - } - return ctx.root; - }).toRule(RuleType.COLLECT_JOIN_CONSTRAINT), - logicalProject(logicalOlapScan()).thenApply( ctx -> { - LeadingHint leading = (LeadingHint) ctx.cascadesContext - .getStatementContext().getHintMap().get("Leading"); - if (leading == null) { + if (!ctx.cascadesContext.isLeadingJoin()) { return ctx.root; } + LeadingHint leading = (LeadingHint) ctx.cascadesContext + .getHintMap().get("Leading"); LogicalProject project = ctx.root; LogicalOlapScan scan = project.child(); leading.getRelationIdToScanMap().put(scan.getRelationId(), project); @@ -195,15 +175,11 @@ public class CollectJoinConstraint implements RewriteRuleFactory { if (getNotNullable && slot.nullable()) { continue; } - if (!slot.isColumnFromTable()) { + if (!slot.isColumnFromTable() && (slot.getQualifier() == null || slot.getQualifier().isEmpty())) { // we can not get info from column not from table continue; } - String tableName = leading.getExprIdToTableNameMap().get(slot.getExprId()); - if (tableName == null) { - tableName = slot.getQualifier().get(slot.getQualifier().size() - 1); - leading.getExprIdToTableNameMap().put(slot.getExprId(), tableName); - } + String tableName = slot.getQualifier().get(slot.getQualifier().size() - 1); RelationId id = leading.findRelationIdAndTableName(tableName); if (id == null) { leading.setStatus(Hint.HintStatus.SYNTAX_ERROR); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CollectSubQueryAlias.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CollectSubQueryAlias.java new file mode 100644 index 0000000000..559c289240 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CollectSubQueryAlias.java @@ -0,0 +1,69 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.nereids.rules.analysis; + +import org.apache.doris.common.Pair; +import org.apache.doris.nereids.hint.LeadingHint; +import org.apache.doris.nereids.rules.Rule; +import org.apache.doris.nereids.rules.RuleType; +import org.apache.doris.nereids.rules.rewrite.RewriteRuleFactory; +import org.apache.doris.nereids.trees.plans.RelationId; +import org.apache.doris.nereids.trees.plans.logical.LogicalCatalogRelation; +import org.apache.doris.nereids.trees.plans.logical.LogicalRelation; + +import com.google.common.collect.ImmutableList; + +import java.util.List; + +/** + * Eliminate the logical sub query and alias node after analyze and before rewrite + * If we match the alias node and return its child node, in the execute() of the job + *

+ * TODO: refactor group merge strategy to support the feature above + */ +public class CollectSubQueryAlias implements RewriteRuleFactory { + @Override + public List buildRules() { + return ImmutableList.of( + logicalSubQueryAlias().thenApply(ctx -> { + if (ctx.cascadesContext.isLeadingJoin()) { + String aliasName = ctx.root.getAlias(); + LeadingHint leading = (LeadingHint) ctx.cascadesContext.getHintMap().get("Leading"); + RelationId newId = ctx.statementContext.getNextRelationId(); + leading.putRelationIdAndTableName(Pair.of(newId, aliasName)); + leading.getRelationIdToScanMap().put(newId, ctx.root); + ctx.root.setRelationId(newId); + } + return ctx.root; + }).toRule(RuleType.COLLECT_JOIN_CONSTRAINT), + logicalRelation().thenApply(ctx -> { + if (ctx.cascadesContext.isLeadingJoin()) { + LeadingHint leading = (LeadingHint) ctx.cascadesContext.getHintMap().get("Leading"); + LogicalRelation relation = (LogicalRelation) ctx.root; + RelationId relationId = relation.getRelationId(); + if (ctx.root instanceof LogicalCatalogRelation) { + String relationName = ((LogicalCatalogRelation) ctx.root).getTable().getName(); + leading.putRelationIdAndTableName(Pair.of(relationId, relationName)); + } + leading.getRelationIdToScanMap().put(relationId, ctx.root); + } + return ctx.root; + }).toRule(RuleType.COLLECT_JOIN_CONSTRAINT) + ); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/pre/EliminateLogicalSelectHint.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/EliminateLogicalSelectHint.java similarity index 55% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/processor/pre/EliminateLogicalSelectHint.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/EliminateLogicalSelectHint.java index 8ee147c7fe..73bb42ccf0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/pre/EliminateLogicalSelectHint.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/EliminateLogicalSelectHint.java @@ -15,22 +15,25 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.processor.pre; +package org.apache.doris.nereids.rules.analysis; import org.apache.doris.analysis.SetVar; import org.apache.doris.analysis.StringLiteral; +import org.apache.doris.common.DdlException; +import org.apache.doris.nereids.CascadesContext; import org.apache.doris.nereids.StatementContext; import org.apache.doris.nereids.exceptions.AnalysisException; import org.apache.doris.nereids.hint.Hint; import org.apache.doris.nereids.hint.LeadingHint; -import org.apache.doris.nereids.jobs.JobContext; +import org.apache.doris.nereids.hint.OrderedHint; import org.apache.doris.nereids.properties.SelectHint; import org.apache.doris.nereids.properties.SelectHintLeading; import org.apache.doris.nereids.properties.SelectHintSetVar; +import org.apache.doris.nereids.rules.Rule; +import org.apache.doris.nereids.rules.RuleType; +import org.apache.doris.nereids.rules.rewrite.OneRewriteRuleFactory; import org.apache.doris.nereids.trees.plans.Plan; -import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; import org.apache.doris.nereids.trees.plans.logical.LogicalSelectHint; -import org.apache.doris.nereids.trees.plans.visitor.CustomRewriter; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.SessionVariable; import org.apache.doris.qe.VariableMgr; @@ -38,38 +41,44 @@ import org.apache.doris.qe.VariableMgr; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Map; import java.util.Map.Entry; import java.util.Optional; /** - * eliminate set var hint, and set var to session variables. + * eliminate logical select hint and set them to cascade context */ -public class EliminateLogicalSelectHint extends PlanPreprocessor implements CustomRewriter { +public class EliminateLogicalSelectHint extends OneRewriteRuleFactory { private Logger logger = LoggerFactory.getLogger(getClass()); @Override - public Plan rewriteRoot(Plan plan, JobContext jobContext) { - return plan.accept(this, jobContext.getCascadesContext().getStatementContext()); - } - - @Override - public LogicalPlan visitLogicalSelectHint( - LogicalSelectHint selectHintPlan, - StatementContext context) { - for (Entry hint : selectHintPlan.getHints().entrySet()) { - String hintName = hint.getKey(); - if (hintName.equalsIgnoreCase("SET_VAR")) { - setVar((SelectHintSetVar) hint.getValue(), context); - } else if (hintName.equalsIgnoreCase("ORDERED")) { - ConnectContext.get().getSessionVariable().setDisableJoinReorder(true); - } else if (hintName.equalsIgnoreCase("LEADING")) { - extractLeading((SelectHintLeading) hint.getValue(), context); - } else { - logger.warn("Can not process select hint '{}' and skip it", hint.getKey()); + public Rule build() { + return logicalSelectHint().thenApply(ctx -> { + LogicalSelectHint selectHintPlan = ctx.root; + for (Entry hint : selectHintPlan.getHints().entrySet()) { + String hintName = hint.getKey(); + if (hintName.equalsIgnoreCase("SET_VAR")) { + setVar((SelectHintSetVar) hint.getValue(), ctx.statementContext); + } else if (hintName.equalsIgnoreCase("ORDERED")) { + try { + ctx.cascadesContext.getConnectContext().getSessionVariable() + .disableNereidsJoinReorderOnce(); + } catch (DdlException e) { + throw new RuntimeException(e); + } + OrderedHint ordered = new OrderedHint("Ordered"); + ordered.setStatus(Hint.HintStatus.SUCCESS); + ctx.cascadesContext.getHintMap().put("Ordered", ordered); + ctx.statementContext.addHint(ordered); + } else if (hintName.equalsIgnoreCase("LEADING")) { + extractLeading((SelectHintLeading) hint.getValue(), ctx.cascadesContext, + ctx.statementContext, selectHintPlan.getHints()); + } else { + logger.warn("Can not process select hint '{}' and skip it", hint.getKey()); + } } - } - - return (LogicalPlan) selectHintPlan.child(); + return selectHintPlan.child(); + }).toRule(RuleType.ELIMINATE_LOGICAL_SELECT_HINT); } private void setVar(SelectHintSetVar selectHint, StatementContext context) { @@ -84,7 +93,7 @@ public class EliminateLogicalSelectHint extends PlanPreprocessor implements Cust VariableMgr.setVar(sessionVariable, new SetVar(key, new StringLiteral(value.get()))); } catch (Throwable t) { throw new AnalysisException("Can not set session variable '" - + key + "' = '" + value.get() + "'", t); + + key + "' = '" + value.get() + "'", t); } } } @@ -101,15 +110,28 @@ public class EliminateLogicalSelectHint extends PlanPreprocessor implements Cust } } - private void extractLeading(SelectHintLeading selectHint, StatementContext context) { + private void extractLeading(SelectHintLeading selectHint, CascadesContext context, + StatementContext statementContext, Map hints) { LeadingHint hint = new LeadingHint("Leading", selectHint.getParameters(), selectHint.toString()); if (context.getHintMap().get("Leading") != null) { hint.setStatus(Hint.HintStatus.SYNTAX_ERROR); - hint.setErrorMessage("can only have one leading clause"); + context.getHintMap().get("Leading").setStatus(Hint.HintStatus.UNUSED); + hint.setErrorMessage("one query block can only have one leading clause"); + statementContext.addHint(hint); + context.setLeadingJoin(false); + return; } + hint.setStatus(Hint.HintStatus.SUCCESS); + statementContext.addHint(hint); context.getHintMap().put("Leading", hint); - context.setLeadingJoin(true); + if (hints.get("ordered") != null || ConnectContext.get().getSessionVariable().isDisableJoinReorder()) { + context.setLeadingJoin(false); + hint.setStatus(Hint.HintStatus.UNUSED); + } else { + context.setLeadingJoin(true); + } assert (selectHint != null); assert (context != null); } + } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/LeadingJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/LeadingJoin.java new file mode 100644 index 0000000000..8332016346 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/LeadingJoin.java @@ -0,0 +1,69 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.nereids.rules.analysis; + +import org.apache.doris.common.DdlException; +import org.apache.doris.nereids.hint.Hint; +import org.apache.doris.nereids.hint.LeadingHint; +import org.apache.doris.nereids.jobs.joinorder.hypergraph.bitmap.LongBitmap; +import org.apache.doris.nereids.rules.Rule; +import org.apache.doris.nereids.rules.RuleType; +import org.apache.doris.nereids.rules.rewrite.RewriteRuleFactory; +import org.apache.doris.nereids.trees.plans.Plan; +import org.apache.doris.qe.ConnectContext; + +import com.google.common.collect.ImmutableList; + +import java.util.List; + +/** + * Leading join is used to generate leading join and replace original logical join +*/ +public class LeadingJoin implements RewriteRuleFactory { + + @Override + public List buildRules() { + return ImmutableList.of( + logicalJoin() + .whenNot(join -> ConnectContext.get().getSessionVariable().isDisableJoinReorder()) + .thenApply(ctx -> { + if (!ctx.cascadesContext.isLeadingJoin()) { + return ctx.root; + } + Hint leadingHint = ctx.cascadesContext.getHintMap().get("Leading"); + ((LeadingHint) leadingHint).setTotalBitmap(); + Long currentBitMap = LongBitmap.computeTableBitmap(ctx.root.getInputRelations()); + if (((LeadingHint) leadingHint).getTotalBitmap().equals(currentBitMap) + && leadingHint.isSuccess()) { + Plan leadingJoin = ((LeadingHint) leadingHint).generateLeadingJoinPlan(); + if (leadingHint.isSuccess() && leadingJoin != null) { + try { + ctx.cascadesContext.getConnectContext().getSessionVariable() + .disableNereidsJoinReorderOnce(); + ctx.cascadesContext.setLeadingJoin(false); + } catch (DdlException e) { + throw new RuntimeException(e); + } + return leadingJoin; + } + } + return ctx.root; + }).toRule(RuleType.LEADING_JOIN) + ); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/LogicalSubQueryAliasToLogicalProject.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/LogicalSubQueryAliasToLogicalProject.java index 9d32a16f49..8a8ef11ea0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/LogicalSubQueryAliasToLogicalProject.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/LogicalSubQueryAliasToLogicalProject.java @@ -17,15 +17,10 @@ package org.apache.doris.nereids.rules.analysis; -import org.apache.doris.common.Pair; -import org.apache.doris.nereids.hint.Hint; -import org.apache.doris.nereids.hint.LeadingHint; import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; import org.apache.doris.nereids.rules.rewrite.OneRewriteRuleFactory; -import org.apache.doris.nereids.trees.plans.RelationId; import org.apache.doris.nereids.trees.plans.logical.LogicalProject; -import org.apache.doris.nereids.trees.plans.logical.LogicalRelation; import com.google.common.collect.ImmutableList; @@ -42,24 +37,6 @@ public class LogicalSubQueryAliasToLogicalProject extends OneRewriteRuleFactory logicalSubQueryAlias().thenApply(ctx -> { LogicalProject project = new LogicalProject<>( ImmutableList.copyOf(ctx.root.getOutput()), ctx.root.child()); - if (ctx.cascadesContext.getStatementContext().isLeadingJoin()) { - String aliasName = ctx.root.getAlias(); - LeadingHint leading = (LeadingHint) ctx.cascadesContext.getStatementContext() - .getHintMap().get("Leading"); - if (!(project.child() instanceof LogicalRelation)) { - if (leading.getTablelist().contains(aliasName)) { - leading.setStatus(Hint.HintStatus.SYNTAX_ERROR); - leading.setErrorMessage("Leading alias can only be table name alias"); - } - } else { - RelationId id = leading.findRelationIdAndTableName(aliasName); - if (id == null) { - id = ((LogicalRelation) project.child()).getRelationId(); - } - leading.putRelationIdAndTableName(Pair.of(id, aliasName)); - leading.getRelationIdToScanMap().put(id, project); - } - } return project; }) ); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SemiJoinCommute.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/JoinCommute.java similarity index 92% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SemiJoinCommute.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/JoinCommute.java index 54dff35746..4611851787 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SemiJoinCommute.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/JoinCommute.java @@ -24,8 +24,10 @@ import org.apache.doris.qe.ConnectContext; /** * RightSemiJoin -> LeftSemiJoin + * RightAntiJoin -> LeftAntiJoin + * RightOuterJoin -> LeftOuterJoin */ -public class SemiJoinCommute extends OneRewriteRuleFactory { +public class JoinCommute extends OneRewriteRuleFactory { @Override public Rule build() { return logicalJoin() diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/LeadingJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/LeadingJoin.java deleted file mode 100644 index 63fda8c906..0000000000 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/LeadingJoin.java +++ /dev/null @@ -1,84 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -package org.apache.doris.nereids.rules.rewrite; - -import org.apache.doris.common.DdlException; -import org.apache.doris.nereids.hint.Hint; -import org.apache.doris.nereids.hint.LeadingHint; -import org.apache.doris.nereids.jobs.JobContext; -import org.apache.doris.nereids.jobs.joinorder.hypergraph.bitmap.LongBitmap; -import org.apache.doris.nereids.rules.rewrite.LeadingJoin.LeadingContext; -import org.apache.doris.nereids.trees.plans.Plan; -import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; -import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; -import org.apache.doris.nereids.trees.plans.visitor.CustomRewriter; -import org.apache.doris.nereids.trees.plans.visitor.DefaultPlanRewriter; - -/** - * Leading join is used to generate leading join and replace original logical join -*/ -public class LeadingJoin extends DefaultPlanRewriter implements CustomRewriter { - - @Override - public Plan rewriteRoot(Plan plan, JobContext jobContext) { - if (jobContext.getCascadesContext().getStatementContext().isLeadingJoin()) { - Hint leadingHint = jobContext.getCascadesContext().getStatementContext().getHintMap().get("Leading"); - Plan leadingPlan = plan.accept(this, new LeadingContext( - (LeadingHint) leadingHint, ((LeadingHint) leadingHint) - .getLeadingTableBitmap(jobContext.getCascadesContext().getTables()))); - if (leadingHint.isSuccess()) { - try { - jobContext.getCascadesContext().getConnectContext().getSessionVariable() - .disableNereidsJoinReorderOnce(); - } catch (DdlException e) { - throw new RuntimeException(e); - } - } else { - return plan; - } - return leadingPlan; - } - return plan; - } - - @Override - public Plan visit(Plan plan, LeadingContext context) { - Long currentBitMap = LongBitmap.computeTableBitmap(plan.getInputRelations()); - if (LongBitmap.isSubset(currentBitMap, context.totalBitmap) - && plan instanceof LogicalJoin && !context.leading.isSyntaxError()) { - Plan leadingJoin = context.leading.generateLeadingJoinPlan(); - if (context.leading.isSuccess() && leadingJoin != null) { - return leadingJoin; - } - } else { - return (LogicalPlan) super.visit(plan, context); - } - return plan; - } - - /** LeadingContext */ - public static class LeadingContext { - public LeadingHint leading; - public Long totalBitmap; - - public LeadingContext(LeadingHint leading, Long totalBitmap) { - this.leading = leading; - this.totalBitmap = totalBitmap; - } - } -} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java index 22530cabea..1135422187 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java @@ -17,10 +17,7 @@ package org.apache.doris.nereids.trees.copier; -import org.apache.doris.common.Pair; import org.apache.doris.nereids.exceptions.AnalysisException; -import org.apache.doris.nereids.hint.Hint; -import org.apache.doris.nereids.hint.LeadingHint; import org.apache.doris.nereids.properties.OrderKey; import org.apache.doris.nereids.trees.expressions.ExprId; import org.apache.doris.nereids.trees.expressions.Expression; @@ -33,7 +30,6 @@ import org.apache.doris.nereids.trees.expressions.StatementScopeIdGenerator; import org.apache.doris.nereids.trees.expressions.SubqueryExpr; import org.apache.doris.nereids.trees.expressions.functions.Function; import org.apache.doris.nereids.trees.plans.Plan; -import org.apache.doris.nereids.trees.plans.RelationId; import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate; import org.apache.doris.nereids.trees.plans.logical.LogicalApply; import org.apache.doris.nereids.trees.plans.logical.LogicalAssertNumRows; @@ -67,7 +63,6 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalTopN; import org.apache.doris.nereids.trees.plans.logical.LogicalUnion; import org.apache.doris.nereids.trees.plans.logical.LogicalWindow; import org.apache.doris.nereids.trees.plans.visitor.DefaultPlanRewriter; -import org.apache.doris.qe.ConnectContext; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -173,7 +168,6 @@ public class LogicalPlanDeepCopier extends DefaultPlanRewriter conjuncts = fileScan.getConjuncts().stream() @@ -241,7 +233,6 @@ public class LogicalPlanDeepCopier extends DefaultPlanRewriter otherJoinConjuncts; private final List hashJoinConjuncts; - private final JoinHint hint; // When the predicate condition contains subqueries and disjunctions, the join will be marked as MarkJoin. private final Optional markJoinSlotReference; @@ -74,6 +73,8 @@ public class LogicalJoin extends LogicalUnary { + protected RelationId relationId; private final List qualifier; private final Optional> columnAliases; @@ -170,4 +174,19 @@ public class LogicalSubQueryAlias extends LogicalUnary< builder.replace(replaceMap); return builder.build(); } + + public void setRelationId(RelationId relationId) { + this.relationId = relationId; + } + + public RelationId getRelationId() { + return relationId; + } + + @Override + public Set getInputRelations() { + Set relationIdSet = Sets.newHashSet(); + relationIdSet.add(relationId); + return relationIdSet; + } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/joinhint/JoinHintTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/joinhint/JoinHintTest.java new file mode 100644 index 0000000000..b4571e4eb1 --- /dev/null +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/joinhint/JoinHintTest.java @@ -0,0 +1,153 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.nereids.jobs.joinorder.joinhint; + +import org.apache.doris.nereids.CascadesContext; +import org.apache.doris.nereids.datasets.tpch.TPCHTestBase; +import org.apache.doris.nereids.properties.SelectHint; +import org.apache.doris.nereids.properties.SelectHintLeading; +import org.apache.doris.nereids.trees.plans.Plan; +import org.apache.doris.nereids.trees.plans.logical.LogicalProject; +import org.apache.doris.nereids.trees.plans.logical.LogicalSelectHint; +import org.apache.doris.nereids.util.HyperGraphBuilder; +import org.apache.doris.nereids.util.MemoTestUtils; +import org.apache.doris.nereids.util.PlanChecker; + +import com.google.common.collect.Maps; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class JoinHintTest extends TPCHTestBase { + + private int used = 0; + private int unused = 0; + + private int syntaxError = 0; + + private int successCases = 0; + + private int unsuccessCases = 0; + + private List failCases = new ArrayList<>(); + + @Test + public void testLeading() { + for (int t = 3; t < 10; t++) { + for (int e = t - 1; e <= (t * (t - 1)) / 2; e++) { + for (int i = 0; i < 10; i++) { + System.out.println("TableNumber: " + String.valueOf(t) + " EdgeNumber: " + e + " Iteration: " + i); + randomTest(t, e, false, true); + } + } + } + int totalCases = successCases + unsuccessCases; + System.out.println("TotalCases: " + totalCases + "\tSuccessCases: " + successCases + unsuccessCases + "\tUnSuccessCases: " + 0); + for (String treePlan : failCases) { + System.out.println(treePlan); + } + } + + @Test + public void testHintJoin() { + for (int t = 3; t < 10; t++) { + for (int e = t - 1; e <= (t * (t - 1)) / 2; e++) { + for (int i = 0; i < 10; i++) { + System.out.println("TableNumber: " + String.valueOf(t) + " EdgeNumber: " + e + " Iteration: " + i); + randomTest(t, e, true, false); + } + } + } + int totalCases = successCases + unsuccessCases; + System.out.println("TotalCases: " + totalCases + "\tSuccessCases: " + successCases + "\tUnSuccessCases: " + unsuccessCases); + for (String treePlan : failCases) { + System.out.println(treePlan); + } + } + + private Plan generateLeadingHintPlan(int tableNum, Plan childPlan) { + Map hints = Maps.newLinkedHashMap(); + List leadingParameters = new ArrayList(); + for (int i = 0; i < tableNum; i++) { + leadingParameters.add(String.valueOf(i)); + } + Collections.shuffle(leadingParameters); + System.out.println("LeadingHint: " + leadingParameters.toString()); + hints.put("leading", new SelectHintLeading("leading", leadingParameters)); + return new LogicalSelectHint<>(hints, childPlan); + } + + private void randomTest(int tableNum, int edgeNum, boolean withJoinHint, boolean withLeading) { + HyperGraphBuilder hyperGraphBuilder = new HyperGraphBuilder(); + Plan plan = withJoinHint ? hyperGraphBuilder.buildJoinPlanWithJoinHint(tableNum, edgeNum) : + hyperGraphBuilder.randomBuildPlanWith(tableNum, edgeNum); + plan = new LogicalProject(plan.getOutput(), plan); + Set> res1 = hyperGraphBuilder.evaluate(plan); + if (!withLeading) { + CascadesContext cascadesContext = MemoTestUtils.createCascadesContext(connectContext, plan); + hyperGraphBuilder.initStats(cascadesContext); + Plan optimizedPlan = PlanChecker.from(cascadesContext) + .analyze() + .optimize() + .getBestPlanTree(); + + Set> res2 = hyperGraphBuilder.evaluate(optimizedPlan); + if (!res1.equals(res2)) { + System.out.println(plan.treeString()); + System.out.println(optimizedPlan.treeString()); + cascadesContext = MemoTestUtils.createCascadesContext(connectContext, plan); + PlanChecker.from(cascadesContext).dpHypOptimize().getBestPlanTree(); + System.out.println(res1); + System.out.println(res2); + unsuccessCases++; + failCases.add(plan.treeString()); + failCases.add(optimizedPlan.treeString()); + } + successCases++; + } else { + // generate select hint + for (int i = 0; i < (tableNum * tableNum - 1); i++) { + Plan leadingPlan = generateLeadingHintPlan(tableNum, plan); + CascadesContext cascadesContext = MemoTestUtils.createCascadesContext(connectContext, leadingPlan); + hyperGraphBuilder.initStats(cascadesContext); + Plan optimizedPlan = PlanChecker.from(cascadesContext) + .analyze() + .optimize() + .getBestPlanTree(); + + Set> res2 = hyperGraphBuilder.evaluate(optimizedPlan); + if (!res1.equals(res2)) { + System.out.println(leadingPlan.treeString()); + System.out.println(optimizedPlan.treeString()); + cascadesContext = MemoTestUtils.createCascadesContext(connectContext, plan); + PlanChecker.from(cascadesContext).dpHypOptimize().getBestPlanTree(); + System.out.println(res1); + System.out.println(res2); + unsuccessCases++; + failCases.add(leadingPlan.treeString()); + failCases.add(optimizedPlan.treeString()); + } + successCases++; + } + } + } +} diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownLimitTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownLimitTest.java index 9ac6078a07..16bf841160 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownLimitTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownLimitTest.java @@ -137,8 +137,10 @@ class PushDownLimitTest extends TestWithFeService implements MemoPatternMatchSup @Test void testPushLimitThroughRightJoin() { + ConnectContext context = MemoTestUtils.createConnectContext(); + context.getSessionVariable().setDisableJoinReorder(true); // after use RelationUtil to allocate relation id, the id will increase when getNextId() called. - test(JoinType.RIGHT_OUTER_JOIN, true, + testWithContext(context, JoinType.RIGHT_OUTER_JOIN, true, logicalLimit( logicalProject( rightOuterLogicalJoin( @@ -148,7 +150,7 @@ class PushDownLimitTest extends TestWithFeService implements MemoPatternMatchSup ) ) ); - test(JoinType.RIGHT_OUTER_JOIN, false, + testWithContext(context, JoinType.RIGHT_OUTER_JOIN, false, logicalLimit( rightOuterLogicalJoin( logicalOlapScan().when(s -> s.getTable().getName().equals("score")), @@ -355,6 +357,15 @@ class PushDownLimitTest extends TestWithFeService implements MemoPatternMatchSup .matchesFromRoot(pattern); } + private void testWithContext(ConnectContext context, JoinType joinType, boolean hasProject, PatternDescriptor pattern) { + Plan plan = generatePlan(joinType, hasProject); + PlanChecker.from(context) + .analyze(plan) + .applyTopDown(new ConvertInnerOrCrossJoin()) + .applyTopDown(new PushDownLimit()) + .matchesFromRoot(pattern); + } + private Plan generatePlan(JoinType joinType, boolean hasProject) { ImmutableList joinConditions = joinType == JoinType.CROSS_JOIN || joinType == JoinType.INNER_JOIN diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/sqltest/InferTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/sqltest/InferTest.java index 43c8c4b9dc..26f6c81079 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/sqltest/InferTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/sqltest/InferTest.java @@ -50,9 +50,9 @@ public class InferTest extends SqlTestBase { .matches( logicalProject( innerLogicalJoin( + logicalOlapScan(), logicalFilter().when( - f -> f.getPredicate().toString().equals("((id#0 = 4) OR (id#0 > 4))")), - logicalOlapScan() + f -> f.getPredicate().toString().equals("((id#0 = 4) OR (id#0 > 4))")) ) ) ); @@ -89,8 +89,8 @@ public class InferTest extends SqlTestBase { .rewrite() .matches( innerLogicalJoin( - leftSemiLogicalJoin(), - logicalProject() + logicalProject(), + leftSemiLogicalJoin() ) ); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/HyperGraphBuilder.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/HyperGraphBuilder.java index 6677d5756d..6a84364260 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/HyperGraphBuilder.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/HyperGraphBuilder.java @@ -27,6 +27,7 @@ import org.apache.doris.nereids.trees.expressions.EqualTo; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.Slot; import org.apache.doris.nereids.trees.expressions.SlotReference; +import org.apache.doris.nereids.trees.plans.JoinHint; import org.apache.doris.nereids.trees.plans.JoinType; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; @@ -50,6 +51,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Random; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -115,7 +117,7 @@ public class HyperGraphBuilder { public Plan buildJoinPlan() { assert plans.size() == 1 : "there are cross join"; Plan plan = plans.values().iterator().next(); - return buildPlanWithJoinType(plan, new BitSet()); + return buildPlanWithJoinType(plan, new BitSet(), false); } public Plan randomBuildPlanWith(int tableNum, int edgeNum) { @@ -128,6 +130,13 @@ public class HyperGraphBuilder { return this.build(); } + public Plan buildJoinPlanWithJoinHint(int tableNum, int edgeNum) { + randomBuildInit(tableNum, edgeNum); + assert plans.size() == 1 : "there are cross join"; + Plan plan = plans.values().iterator().next(); + return buildPlanWithJoinType(plan, new BitSet(), true); + } + private void randomBuildInit(int tableNum, int edgeNum) { Preconditions.checkArgument(edgeNum >= tableNum - 1, "We can't build a connected graph with %s tables %s edges", tableNum, edgeNum); @@ -242,7 +251,7 @@ public class HyperGraphBuilder { return this; } - private Plan buildPlanWithJoinType(Plan plan, BitSet requireTable) { + private Plan buildPlanWithJoinType(Plan plan, BitSet requireTable, boolean withJoinHint) { if (!(plan instanceof LogicalJoin)) { return plan; } @@ -269,11 +278,20 @@ public class HyperGraphBuilder { } } - Plan left = buildPlanWithJoinType(join.left(), requireTable); - Plan right = buildPlanWithJoinType(join.right(), requireTable); + Plan left = buildPlanWithJoinType(join.left(), requireTable, withJoinHint); + Plan right = buildPlanWithJoinType(join.right(), requireTable, withJoinHint); Set outputs = Stream.concat(left.getOutput().stream(), right.getOutput().stream()) .collect(Collectors.toSet()); assert outputs.containsAll(requireSlots); + if (withJoinHint) { + JoinHint[] values = JoinHint.values(); + Random random = new Random(); + int randomIndex = random.nextInt(values.length); + JoinHint hint = values[randomIndex]; + Plan hintJoin = ((LogicalJoin) join.withChildren(left, right)).withJoinType(joinType); + ((LogicalJoin) hintJoin).setHint(hint); + return hintJoin; + } return ((LogicalJoin) join.withChildren(left, right)).withJoinType(joinType); } @@ -528,6 +546,8 @@ public class HyperGraphBuilder { matchPair.stream().map(p -> Pair.of(p.second, p.first)).collect(Collectors.toList())); case NULL_AWARE_LEFT_ANTI_JOIN: return calLNAAJ(left, right, matchPair); + case CROSS_JOIN: + return calFOJ(left, right, matchPair); default: assert false; } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/MemoValidator.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/MemoValidator.java index 1bd8f2aaf8..807c6fc0d5 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/MemoValidator.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/MemoValidator.java @@ -23,6 +23,7 @@ import org.apache.doris.nereids.memo.GroupExpression; import org.apache.doris.nereids.memo.GroupId; import org.apache.doris.nereids.memo.Memo; import org.apache.doris.nereids.trees.plans.Plan; +import org.apache.doris.nereids.trees.plans.logical.LogicalSelectHint; import com.google.common.collect.Sets; import org.junit.jupiter.api.Assertions; @@ -52,7 +53,7 @@ public class MemoValidator { MemoValidator validator = validate(memo); if (initPlan != null) { - if (initPlan instanceof UnboundResultSink) { + if (initPlan instanceof UnboundResultSink || initPlan instanceof LogicalSelectHint) { return validator; } Assertions.assertEquals(initPlan, memo.getRoot().getLogicalExpression().getPlan()); diff --git a/regression-test/data/nereids_p0/hint/t1.csv b/regression-test/data/nereids_p0/hint/t1.csv new file mode 100644 index 0000000000..7aafcb8f4b --- /dev/null +++ b/regression-test/data/nereids_p0/hint/t1.csv @@ -0,0 +1,1000 @@ +454|350 +259|231 +241|5 +128|39 +173|323 +286|46 +\N|446 +215|56 +294|172 +\N|89 +330|\N +163|495 +314|\N +174|64 +53|353 +70|384 +461|37 +297|402 +206|463 +32|343 +287|29 +396|200 +457|305 +449|210 +303|51 +179|341 +404|158 +152|75 +262|147 +62|\N +387|178 +499|152 +455|251 +152|488 +495|35 +296|309 +107|\N +127|109 +147|129 +474|0 +5|\N +45|68 +181|265 +218|132 +209|451 +379|93 +114|356 +129|\N +252|226 +108|396 +181|236 +428|80 +279|450 +151|126 +435|323 +248|187 +14|42 +155|236 +88|366 +54|209 +220|357 +58|327 +333|376 +381|458 +488|453 +405|410 +236|192 +288|418 +10|291 +434|150 +431|251 +49|358 +51|121 +\N|236 +264|203 +453|360 +390|276 +121|463 +6|226 +316|481 +379|267 +68|371 +473|176 +362|213 +266|279 +489|10 +400|215 +\N|492 +161|317 +89|339 +3|370 +445|446 +443|45 +297|286 +418|147 +381|490 +334|469 +482|25 +30|102 +178|401 +427|144 +303|100 +329|341 +49|320 +108|103 +256|2 +\N|488 +351|400 +246|73 +218|151 +58|46 +352|31 +213|213 +482|336 +106|149 +238|213 +166|182 +65|438 +12|143 +101|104 +304|337 +193|31 +474|422 +172|190 +500|235 +206|378 +428|362 +335|191 +134|490 +313|449 +399|400 +412|54 +174|416 +460|351 +193|452 +39|78 +136|187 +155|390 +324|174 +171|47 +209|379 +287|431 +159|10 +447|274 +71|60 +298|15 +371|247 +273|484 +329|477 +460|\N +488|21 +166|483 +321|483 +202|351 +459|292 +415|476 +397|259 +381|343 +\N|378 +402|418 +456|492 +326|444 +120|103 +323|\N +465|227 +132|159 +53|13 +324|88 +200|156 +233|271 +383|178 +\N|351 +242|255 +7|366 +446|42 +31|6 +302|69 +189|319 +231|54 +240|436 +301|413 +47|47 +474|214 +434|410 +334|319 +432|117 +340|66 +478|246 +151|60 +411|385 +326|56 +83|144 +\N|304 +242|113 +241|394 +148|496 +268|325 +409|492 +\N|\N +263|327 +217|13 +267|409 +135|220 +138|112 +477|320 +499|161 +\N|458 +129|329 +389|117 +21|194 +92|394 +76|168 +227|15 +233|429 +138|181 +467|393 +202|333 +20|427 +408|121 +\N|323 +429|399 +179|136 +253|403 +425|198 +20|118 +299|54 +409|474 +310|189 +178|367 +104|95 +315|106 +101|290 +82|335 +48|44 +\N|444 +284|344 +160|458 +253|225 +120|399 +375|\N +241|499 +36|65 +104|56 +85|242 +7|141 +40|235 +178|41 +122|87 +362|419 +291|491 +125|316 +43|106 +448|21 +199|111 +476|29 +\N|259 +362|119 +242|456 +405|415 +247|\N +280|14 +489|70 +495|\N +188|112 +134|267 +82|405 +456|277 +214|304 +390|376 +49|449 +486|37 +336|326 +255|334 +178|34 +357|374 +48|395 +89|494 +210|285 +61|321 +268|432 +246|83 +428|40 +33|\N +424|62 +127|219 +415|16 +101|244 +300|326 +48|306 +61|248 +73|21 +161|\N +432|\N +373|107 +107|7 +344|438 +\N|288 +7|323 +406|331 +8|\N +\N|24 +276|216 +161|165 +82|205 +\N|246 +37|420 +243|\N +216|486 +109|313 +73|377 +171|351 +199|\N +171|107 +197|192 +184|55 +28|472 +192|88 +\N|113 +289|0 +70|48 +27|239 +455|77 +173|202 +385|186 +345|12 +36|357 +262|28 +27|16 +368|230 +252|52 +169|468 +35|76 +64|445 +282|260 +462|13 +288|428 +299|109 +359|54 +372|162 +488|472 +458|52 +378|81 +325|498 +276|62 +199|265 +\N|434 +184|4 +140|275 +293|\N +\N|309 +\N|404 +31|293 +218|\N +137|86 +452|46 +268|440 +242|350 +291|10 +93|405 +71|166 +87|230 +235|135 +119|149 +81|\N +431|352 +82|18 +29|227 +71|425 +386|38 +466|420 +380|379 +246|255 +59|310 +163|326 +199|339 +5|\N +155|392 +44|63 +\N|287 +375|229 +273|311 +464|260 +178|195 +161|331 +165|494 +470|\N +231|\N +296|183 +88|\N +\N|207 +\N|114 +11|211 +276|163 +246|457 +45|270 +143|97 +237|156 +255|362 +430|374 +214|193 +106|222 +109|177 +53|129 +141|9 +263|240 +315|69 +393|346 +\N|338 +55|\N +34|493 +184|228 +77|223 +367|470 +353|349 +83|359 +120|304 +154|395 +142|193 +205|95 +428|47 +420|401 +231|15 +165|285 +300|457 +271|83 +339|361 +443|151 +256|415 +218|102 +297|33 +441|327 +\N|314 +370|42 +201|102 +131|490 +96|458 +109|59 +225|131 +378|231 +488|36 +171|421 +390|469 +14|126 +322|20 +193|\N +59|379 +205|27 +173|259 +148|259 +237|193 +386|80 +138|424 +188|495 +440|120 +118|398 +41|375 +262|71 +500|433 +89|497 +93|231 +389|426 +99|55 +363|274 +63|143 +158|388 +98|352 +\N|141 +127|169 +434|110 +300|303 +414|293 +458|307 +326|333 +97|262 +415|421 +120|392 +232|117 +153|222 +254|2 +157|\N +221|406 +419|230 +150|97 +278|340 +174|418 +251|481 +166|30 +347|319 +230|327 +258|\N +\N|441 +58|294 +257|295 +265|453 +67|180 +445|232 +25|414 +408|106 +367|365 +390|6 +424|23 +12|134 +44|422 +154|100 +\N|424 +305|20 +113|323 +70|457 +102|101 +53|317 +129|157 +275|232 +49|489 +\N|253 +258|119 +458|257 +168|129 +76|467 +480|459 +125|199 +391|269 +254|485 +294|209 +300|74 +448|111 +216|120 +\N|37 +406|320 +497|178 +97|97 +28|376 +70|408 +17|165 +107|206 +125|305 +406|388 +238|207 +199|434 +1|259 +389|457 +232|65 +113|414 +461|443 +18|187 +2|275 +378|236 +428|77 +398|154 +133|1 +336|89 +2|381 +111|130 +184|433 +439|113 +336|357 +202|275 +433|400 +173|96 +\N|243 +96|57 +282|139 +432|20 +410|302 +358|276 +79|\N +460|102 +136|\N +417|55 +293|38 +13|418 +1|22 +441|\N +\N|237 +81|180 +94|186 +118|168 +294|145 +76|151 +470|67 +171|25 +255|456 +345|44 +492|439 +6|156 +494|254 +184|244 +301|216 +88|50 +304|213 +130|214 +387|251 +106|\N +369|429 +27|\N +206|419 +18|403 +253|427 +374|59 +122|500 +117|15 +412|351 +141|33 +478|343 +124|67 +339|383 +69|348 +430|153 +391|198 +258|262 +38|293 +305|316 +314|32 +338|450 +321|153 +290|215 +131|231 +45|\N +269|364 +120|\N +212|99 +340|63 +319|137 +497|36 +101|97 +223|135 +385|115 +293|390 +206|499 +154|384 +\N|362 +170|457 +\N|77 +285|248 +4|468 +80|400 +10|347 +14|314 +\N|372 +431|115 +41|353 +317|144 +499|421 +269|493 +153|224 +49|238 +376|97 +460|203 +370|133 +264|332 +123|92 +435|125 +76|295 +405|71 +112|248 +83|\N +417|182 +171|477 +220|261 +297|178 +188|440 +463|85 +366|402 +417|499 +209|297 +242|80 +263|427 +217|37 +2|139 +\N|287 +370|499 +256|33 +123|201 +106|419 +\N|186 +17|336 +353|277 +\N|424 +407|100 +217|\N +121|251 +452|407 +260|32 +57|222 +484|483 +386|94 +268|239 +340|204 +\N|75 +125|450 +272|468 +481|102 +499|486 +387|448 +352|255 +434|253 +321|243 +419|304 +316|169 +112|233 +389|82 +229|204 +158|275 +188|370 +218|469 +427|201 +\N|294 +100|434 +394|483 +286|299 +474|291 +430|480 +80|122 +269|150 +278|397 +371|299 +347|217 +440|55 +281|186 +169|183 +94|419 +106|479 +35|397 +40|70 +138|192 +247|341 +280|161 +327|119 +201|231 +290|176 +376|145 +\N|203 +259|421 +\N|278 +448|123 +\N|309 +251|288 +181|172 +382|272 +130|41 +492|485 +124|372 +\N|271 +421|81 +427|313 +193|499 +299|493 +228|204 +478|389 +85|120 +88|307 +106|168 +203|457 +316|356 +473|468 +67|145 +480|131 +305|61 +257|\N +83|78 +321|451 +358|491 +487|257 +421|406 +157|329 +29|282 +28|53 +363|48 +149|438 +452|401 +343|427 +462|446 +185|\N +16|316 +212|332 +272|65 +46|75 +8|240 +359|232 +298|121 +286|25 +475|3 +423|28 +388|476 +237|408 +21|441 +376|7 +79|80 +119|493 +165|79 +448|236 +47|319 +20|363 +\N|187 +6|442 +248|358 +303|256 +225|361 +459|431 +159|13 +\N|\N +123|366 +72|229 +470|42 +480|359 +\N|366 +99|105 +341|297 +458|292 +34|112 +\N|248 +125|100 +391|453 +317|283 +372|299 +215|402 +487|432 +190|289 +68|15 +227|344 +297|103 +348|248 +466|108 +32|393 +200|106 +170|130 +82|262 +423|21 +34|123 +282|388 +331|363 +162|479 +39|110 +370|51 +72|328 +343|377 +170|251 +341|99 +\N|419 +270|328 +446|330 +73|214 +120|223 +161|461 +332|138 +90|441 +98|267 +220|423 +231|455 +186|280 +46|405 +160|433 +155|365 +80|378 +232|483 +296|436 +480|495 +411|83 +158|11 +405|255 +150|432 +308|239 +341|307 +23|210 +193|252 +171|283 +194|126 +204|386 +376|363 +\N|439 +178|135 +150|72 +319|270 +175|178 +424|48 +193|23 +447|0 +218|188 +\N|367 +155|486 +\N|179 +80|388 +300|70 +268|104 +286|286 +267|38 +415|272 +142|318 +417|\N +143|382 +369|382 +499|479 +14|430 +274|197 +236|211 +347|66 +111|294 +440|281 +318|203 +\N|174 +140|378 +21|\N +\N|173 +273|14 +371|356 +341|156 +172|124 +171|7 +490|234 +351|25 +138|122 +218|193 +251|253 +448|217 +286|165 +60|85 +444|368 +346|185 +221|442 +1|327 +261|126 +286|151 +500|446 +147|497 +28|293 +347|132 +124|\N +481|270 +83|41 +338|219 +281|316 +282|456 +285|243 +166|490 +461|259 +232|136 +173|311 +443|390 +187|\N +63|446 +170|156 +468|187 +73|397 +25|287 +381|468 +218|121 +241|350 +51|459 +439|477 +318|153 +311|301 +278|94 +206|405 +62|19 +175|248 +121|272 +400|246 +408|40 +2|37 +374|123 +247|323 +83|355 +226|457 +489|496 +48|401 +298|43 +33|273 +420|287 +352|247 +347|\N +279|233 +128|363 +287|82 +386|308 +184|453 +0|197 +419|198 +323|266 +243|225 +470|17 +73|0 +\N|84 +37|219 +84|435 +32|169 +327|331 +329|73 +195|438 +\N|52 +124|314 +194|388 +46|250 +11|472 +172|272 +312|105 +489|363 +236|248 +45|345 +158|180 +249|154 +484|283 diff --git a/regression-test/data/nereids_p0/hint/t2.csv b/regression-test/data/nereids_p0/hint/t2.csv new file mode 100644 index 0000000000..cf6d6f98d1 --- /dev/null +++ b/regression-test/data/nereids_p0/hint/t2.csv @@ -0,0 +1,1000 @@ +54|491 +259|317 +196|99 +81|289 +200|357 +\N|225 +236|244 +479|122 +324|117 +158|470 +311|34 +258|480 +182|365 +370|\N +407|79 +276|149 +\N|496 +273|\N +207|367 +\N|291 +335|9 +427|150 +35|361 +176|248 +88|89 +204|\N +423|82 +36|181 +187|446 +49|110 +343|340 +424|421 +68|\N +334|101 +166|452 +88|360 +65|107 +495|331 +399|234 +466|290 +432|55 +58|390 +404|58 +17|97 +179|236 +356|454 +486|234 +484|182 +103|477 +\N|29 +226|469 +203|25 +157|278 +\N|\N +240|254 +48|268 +143|67 +154|223 +321|177 +438|489 +37|119 +434|451 +194|226 +354|13 +332|5 +84|127 +127|127 +81|369 +463|297 +140|276 +391|349 +204|331 +434|\N +15|167 +286|394 +276|261 +116|451 +62|427 +494|491 +252|302 +93|364 +475|258 +\N|109 +278|397 +0|41 +53|266 +\N|341 +302|90 +455|160 +471|329 +405|498 +131|5 +345|261 +292|292 +257|115 +\N|129 +56|297 +138|319 +66|126 +332|469 +181|488 +349|478 +396|375 +284|196 +349|307 +359|266 +59|311 +216|211 +176|212 +202|273 +19|221 +400|259 +146|267 +312|431 +433|373 +59|416 +132|184 +428|347 +417|496 +267|45 +263|406 +464|441 +242|208 +405|432 +289|282 +371|81 +353|65 +450|161 +54|57 +139|224 +98|45 +418|\N +184|321 +158|449 +\N|288 +194|162 +161|393 +205|28 +37|363 +150|319 +386|340 +50|389 +110|285 +179|131 +\N|124 +72|328 +373|389 +311|142 +334|342 +266|216 +32|368 +150|466 +493|325 +217|488 +154|346 +369|300 +440|216 +469|54 +419|195 +451|270 +467|245 +321|349 +47|211 +469|406 +1|124 +151|393 +499|295 +\N|498 +133|220 +279|133 +428|278 +110|358 +\N|\N +476|37 +21|189 +450|481 +263|78 +117|58 +318|117 +183|391 +81|386 +145|144 +355|486 +342|398 +\N|422 +169|258 +\N|278 +51|34 +182|421 +70|129 +183|70 +132|412 +163|99 +15|224 +59|311 +208|385 +372|106 +396|497 +134|329 +142|291 +203|491 +197|277 +143|29 +65|51 +353|323 +\N|388 +129|95 +230|185 +315|183 +390|298 +434|107 +193|181 +490|233 +500|308 +144|425 +44|\N +281|310 +186|283 +200|229 +67|78 +264|190 +283|412 +340|168 +184|412 +235|\N +192|328 +267|120 +80|171 +109|125 +44|482 +324|371 +351|363 +74|80 +418|433 +490|298 +109|192 +\N|198 +52|328 +301|340 +403|370 +30|405 +178|110 +177|248 +263|215 +369|239 +355|498 +90|277 +462|8 +181|84 +148|228 +398|163 +241|131 +436|185 +361|54 +\N|212 +366|227 +352|\N +341|179 +23|177 +383|409 +497|63 +264|361 +\N|40 +452|125 +271|238 +206|129 +318|5 +154|368 +126|140 +298|449 +75|275 +112|134 +327|182 +137|193 +348|315 +\N|119 +\N|184 +63|114 +479|138 +58|183 +76|123 +495|4 +192|8 +101|\N +384|456 +195|156 +214|85 +232|102 +415|345 +282|50 +269|8 +448|141 +365|233 +412|87 +453|320 +376|35 +13|46 +167|78 +49|250 +365|406 +448|168 +178|235 +463|391 +285|492 +331|289 +\N|357 +0|31 +370|471 +89|413 +361|\N +328|326 +137|50 +182|437 +379|280 +388|480 +269|231 +\N|84 +262|256 +230|216 +354|26 +392|349 +231|496 +345|377 +410|358 +187|222 +308|84 +194|254 +451|36 +18|378 +420|430 +411|238 +470|\N +\N|396 +210|389 +24|368 +\N|372 +242|106 +258|60 +321|154 +358|140 +51|222 +169|95 +331|385 +255|51 +442|\N +96|315 +302|407 +500|\N +447|144 +264|415 +207|160 +115|390 +328|394 +236|482 +330|216 +341|309 +9|152 +207|264 +446|188 +60|292 +419|108 +332|57 +427|327 +328|122 +489|280 +467|97 +235|11 +124|203 +138|402 +491|\N +469|330 +253|280 +15|498 +302|67 +417|59 +356|128 +439|186 +461|47 +163|403 +468|128 +62|253 +393|241 +21|92 +\N|397 +209|386 +52|458 +\N|463 +442|344 +0|271 +391|315 +190|130 +\N|\N +321|39 +414|101 +\N|189 +97|63 +37|258 +400|22 +201|279 +239|288 +420|399 +195|331 +431|378 +362|71 +291|188 +185|496 +252|322 +8|224 +59|475 +493|298 +375|13 +83|72 +402|280 +414|448 +367|467 +\N|348 +422|468 +102|170 +32|236 +357|19 +188|411 +42|87 +143|277 +389|231 +6|194 +439|37 +80|54 +229|474 +371|22 +93|470 +261|134 +243|402 +263|194 +404|363 +133|373 +181|446 +465|262 +496|426 +175|\N +454|333 +85|\N +22|438 +201|302 +92|392 +111|435 +495|348 +243|337 +\N|\N +406|55 +142|216 +319|414 +177|113 +203|33 +210|\N +309|242 +215|332 +96|214 +140|179 +359|41 +143|370 +281|482 +219|436 +177|39 +445|196 +249|134 +245|200 +360|225 +455|299 +288|378 +283|62 +72|193 +311|178 +\N|373 +298|253 +41|124 +213|349 +321|199 +372|301 +117|190 +41|23 +119|281 +20|45 +473|9 +145|372 +249|53 +387|49 +80|124 +470|104 +260|321 +78|436 +289|308 +261|126 +\N|45 +412|350 +263|157 +103|389 +344|426 +436|148 +299|408 +111|54 +298|456 +\N|\N +429|169 +419|391 +492|102 +206|119 +78|230 +220|251 +19|318 +274|347 +251|203 +84|109 +343|102 +20|496 +394|308 +66|174 +364|393 +271|6 +424|475 +26|368 +247|376 +240|251 +113|380 +10|343 +201|488 +160|56 +435|100 +20|93 +489|439 +73|91 +496|15 +243|300 +430|\N +235|\N +175|185 +314|382 +373|203 +277|217 +\N|41 +311|459 +281|304 +88|135 +411|11 +413|128 +414|254 +464|455 +192|223 +167|159 +269|95 +257|272 +114|283 +317|388 +141|362 +197|496 +172|114 +412|200 +298|396 +295|484 +218|363 +198|125 +188|373 +378|86 +53|361 +409|237 +375|401 +489|82 +8|7 +275|\N +79|356 +\N|\N +425|\N +268|300 +170|229 +\N|472 +354|358 +42|416 +430|420 +360|366 +15|4 +75|391 +394|220 +499|47 +145|276 +464|318 +263|39 +\N|0 +193|283 +489|259 +104|476 +370|176 +120|218 +132|275 +375|316 +318|330 +452|152 +441|\N +3|372 +215|123 +272|285 +95|1 +88|5 +151|\N +259|14 +224|221 +\N|220 +185|265 +\N|409 +483|258 +\N|395 +66|\N +241|487 +\N|490 +164|230 +223|15 +359|428 +206|405 +165|470 +355|128 +383|56 +20|238 +452|247 +284|397 +129|296 +198|366 +246|173 +181|72 +280|336 +211|423 +220|181 +81|15 +115|465 +475|401 +447|424 +285|425 +387|25 +152|\N +451|308 +18|382 +221|36 +358|\N +191|155 +395|42 +154|74 +250|78 +9|403 +78|157 +19|343 +270|266 +370|261 +173|322 +360|431 +318|309 +168|400 +223|146 +146|252 +221|349 +260|379 +23|324 +34|448 +66|171 +498|16 +178|28 +291|384 +133|96 +202|405 +339|375 +105|118 +440|86 +416|159 +300|413 +462|212 +40|494 +193|337 +75|359 +378|15 +238|195 +149|97 +4|159 +487|117 +339|223 +138|64 +\N|390 +4|175 +459|448 +299|393 +329|42 +171|\N +430|279 +400|62 +\N|268 +9|184 +81|443 +403|296 +294|248 +\N|177 +452|157 +469|99 +283|50 +209|411 +75|\N +437|231 +94|229 +109|159 +339|35 +233|181 +481|8 +176|45 +201|113 +116|271 +181|245 +\N|378 +29|356 +86|473 +437|153 +356|\N +311|16 +352|158 +350|187 +375|307 +370|98 +184|285 +331|82 +393|401 +159|313 +52|368 +300|430 +426|303 +439|6 +457|209 +485|368 +351|374 +220|169 +446|28 +493|462 +217|409 +414|491 +224|63 +438|133 +60|\N +14|352 +406|209 +352|443 +123|265 +310|79 +201|344 +254|418 +463|149 +266|319 +245|220 +173|21 +403|342 +91|333 +371|54 +34|23 +462|183 +122|337 +91|86 +256|283 +285|116 +214|391 +253|266 +386|311 +3|\N +93|439 +469|428 +\N|169 +337|442 +361|198 +130|66 +73|342 +264|82 +152|278 +101|337 +81|482 +101|253 +71|177 +68|9 +398|314 +19|3 +97|155 +338|227 +112|414 +467|192 +205|376 +\N|447 +36|\N +309|162 +301|150 +164|418 +477|255 +\N|496 +343|101 +30|384 +188|409 +438|128 +134|445 +424|475 +58|201 +387|185 +333|\N +310|87 +279|443 +37|176 +455|453 +497|183 +\N|352 +335|367 +411|135 +85|347 +\N|161 +146|236 +148|393 +157|56 +430|271 +139|14 +\N|150 +415|204 +327|294 +109|354 +353|269 +223|307 +\N|251 +350|127 +18|357 +360|87 +413|152 +256|441 +56|474 +14|0 +38|304 +486|28 +361|138 +82|134 +272|137 +309|373 +57|305 +28|3 +323|\N +343|252 +184|127 +92|\N +86|285 +314|481 +251|1 +351|20 +274|194 +188|272 +335|235 +461|93 +383|224 +336|171 +342|43 +225|127 +197|\N +414|286 +175|474 +115|373 +454|103 +105|213 +139|247 +485|78 +9|239 +230|1 +430|\N +24|208 +309|\N +54|460 +415|310 +493|427 +284|120 +284|478 +18|475 +414|254 +11|289 +\N|45 +104|158 +35|119 +197|493 +27|211 +5|\N +292|\N +24|229 +355|353 +29|452 +365|295 +82|394 +17|491 +303|272 +188|280 +382|70 +230|440 +441|319 +407|387 +51|156 +479|224 +280|471 +215|247 +279|287 +22|314 +139|360 +470|355 +423|423 +65|207 +\N|263 +456|53 +92|456 +326|431 +70|139 +227|31 +380|151 +195|\N +355|385 +494|383 +132|297 +395|124 +380|\N +408|78 +250|326 +346|497 +96|159 +116|435 +465|97 +212|287 +68|283 +69|28 +456|450 +314|155 +318|116 +118|228 +276|\N +73|460 +185|436 +418|43 +255|222 +305|260 +312|\N +201|110 +414|307 +\N|139 +335|368 +218|45 +226|190 +10|74 +170|247 +\N|420 +435|247 +360|15 +279|182 +24|178 +355|271 +457|314 +475|172 +86|435 +\N|188 +166|98 +388|257 +\N|446 +300|390 +50|130 +317|\N +172|379 +40|87 +38|94 +314|42 +30|\N +272|223 +140|357 +361|208 +152|405 +179|95 +68|130 +108|94 +361|463 +106|430 +137|91 +226|362 +\N|450 +48|463 +250|55 +115|\N +489|373 +114|427 +267|262 +475|323 +188|270 +409|350 +418|424 +419|256 +196|352 +435|345 +485|247 +339|123 +499|26 +411|329 +194|367 +231|262 +451|370 +442|378 +194|414 +120|91 diff --git a/regression-test/data/nereids_p0/hint/t3.csv b/regression-test/data/nereids_p0/hint/t3.csv new file mode 100644 index 0000000000..cfae19cec0 --- /dev/null +++ b/regression-test/data/nereids_p0/hint/t3.csv @@ -0,0 +1,1000 @@ +379|311 +347|\N +319|233 +286|355 +30|154 +38|418 +270|294 +\N|162 +241|248 +299|102 +87|154 +482|337 +385|165 +291|308 +49|153 +394|392 +250|249 +487|186 +35|\N +309|167 +427|157 +178|428 +436|112 +412|56 +144|218 +33|488 +48|142 +455|403 +211|232 +355|185 +167|294 +238|116 +191|86 +160|399 +288|321 +494|442 +7|220 +291|486 +496|321 +292|351 +231|214 +392|266 +299|324 +212|176 +17|34 +242|341 +452|27 +\N|155 +363|258 +363|268 +221|\N +361|358 +21|251 +209|232 +439|209 +25|423 +283|271 +364|104 +105|19 +212|115 +224|250 +342|376 +261|27 +19|88 +213|372 +268|426 +102|466 +126|97 +305|312 +476|355 +409|318 +215|375 +234|318 +353|451 +313|11 +296|315 +393|244 +285|46 +289|209 +420|264 +346|482 +317|258 +437|72 +48|468 +88|22 +498|102 +496|85 +456|\N +389|419 +22|144 +473|313 +110|399 +87|240 +235|178 +265|182 +\N|169 +69|69 +222|334 +495|211 +16|95 +98|453 +191|18 +206|248 +433|202 +445|138 +498|391 +65|494 +305|278 +436|219 +\N|217 +150|206 +467|439 +56|381 +174|231 +64|57 +33|228 +241|290 +215|120 +230|228 +306|323 +108|287 +310|70 +372|171 +400|167 +74|32 +468|\N +258|15 +167|164 +237|256 +273|28 +167|333 +289|50 +73|461 +16|56 +332|181 +133|353 +302|265 +154|35 +500|432 +223|456 +327|434 +306|387 +473|144 +93|300 +106|121 +52|152 +108|456 +277|55 +445|451 +244|253 +123|257 +425|473 +131|341 +370|161 +330|78 +321|306 +127|66 +429|130 +\N|34 +4|260 +106|166 +298|407 +366|55 +451|\N +495|384 +178|59 +52|220 +182|165 +336|469 +56|147 +36|151 +17|475 +451|469 +189|404 +124|487 +3|165 +305|392 +43|375 +12|321 +25|\N +371|227 +283|457 +413|125 +\N|251 +101|358 +\N|340 +198|463 +78|407 +168|378 +361|357 +135|37 +38|333 +256|122 +352|37 +21|261 +270|149 +6|466 +488|\N +249|388 +60|297 +\N|399 +466|303 +198|344 +415|314 +500|243 +385|439 +159|286 +130|244 +457|370 +157|206 +249|442 +302|250 +76|475 +112|11 +\N|33 +467|327 +285|229 +365|486 +171|481 +285|82 +225|329 +11|380 +211|328 +387|109 +473|221 +435|297 +352|454 +340|292 +73|346 +183|125 +397|458 +454|369 +227|326 +68|1 +336|63 +\N|40 +94|478 +118|237 +109|161 +370|395 +33|253 +238|285 +406|40 +207|247 +4|453 +346|1 +177|286 +355|48 +348|462 +308|334 +46|6 +220|237 +67|293 +187|117 +178|53 +459|101 +10|31 +444|55 +408|272 +340|34 +14|461 +121|36 +255|494 +497|345 +142|227 +90|423 +101|2 +451|281 +335|230 +166|256 +\N|\N +53|460 +65|429 +417|212 +330|472 +170|215 +216|206 +135|455 +401|48 +99|294 +\N|396 +283|370 +27|184 +472|255 +145|471 +183|335 +\N|140 +284|131 +\N|313 +125|326 +117|31 +347|191 +329|81 +25|431 +494|142 +37|\N +\N|\N +485|226 +264|217 +439|208 +457|243 +9|105 +202|408 +102|349 +446|286 +32|\N +416|13 +437|138 +181|189 +24|166 +448|240 +120|89 +\N|262 +\N|123 +305|120 +\N|88 +476|247 +360|5 +476|162 +305|401 +135|264 +435|376 +64|402 +187|198 +377|240 +\N|146 +430|87 +157|50 +282|397 +\N|57 +140|333 +312|196 +113|355 +10|385 +57|73 +175|\N +421|89 +186|149 +384|184 +363|406 +189|348 +436|\N +374|275 +123|276 +85|465 +\N|89 +416|328 +30|252 +254|\N +243|359 +197|382 +283|273 +30|198 +276|433 +300|132 +446|368 +205|493 +472|229 +\N|443 +207|475 +136|154 +138|374 +71|27 +65|261 +337|116 +290|499 +326|321 +323|226 +286|201 +65|\N +478|56 +\N|403 +313|36 +324|411 +123|131 +148|429 +400|373 +371|125 +476|452 +19|491 +105|7 +457|93 +113|473 +243|489 +130|23 +43|418 +466|422 +485|270 +88|419 +\N|366 +454|205 +384|473 +26|104 +280|45 +59|144 +225|154 +\N|420 +362|4 +268|315 +\N|306 +119|41 +88|392 +437|73 +208|38 +\N|396 +137|121 +248|485 +203|76 +121|72 +365|306 +406|62 +14|134 +418|152 +233|224 +286|342 +408|405 +387|306 +313|468 +459|6 +89|120 +452|375 +4|117 +398|150 +91|80 +401|360 +396|148 +39|222 +137|485 +77|361 +480|\N +121|423 +90|147 +3|299 +462|81 +262|457 +417|218 +\N|493 +64|372 +91|332 +69|\N +\N|70 +136|422 +51|465 +341|342 +485|104 +419|123 +377|326 +\N|196 +468|232 +298|210 +319|412 +258|112 +312|481 +9|332 +222|475 +263|18 +191|178 +336|246 +323|158 +133|165 +158|40 +257|352 +7|47 +245|234 +100|405 +19|263 +189|85 +309|244 +113|404 +92|208 +171|102 +425|305 +\N|48 +455|398 +449|96 +\N|260 +376|121 +85|439 +84|255 +141|491 +3|483 +284|168 +289|81 +45|106 +61|123 +304|210 +304|139 +393|106 +266|410 +364|23 +\N|274 +\N|88 +208|43 +239|277 +455|\N +494|102 +207|61 +137|286 +88|451 +486|317 +259|432 +387|165 +126|263 +272|395 +25|82 +425|0 +140|256 +108|101 +115|379 +259|92 +243|\N +115|460 +97|197 +\N|203 +199|1 +275|275 +35|432 +220|94 +99|96 +120|85 +44|156 +373|95 +351|425 +475|410 +219|\N +114|150 +51|\N +234|376 +266|293 +280|132 +132|122 +450|475 +232|493 +278|110 +301|273 +147|136 +279|50 +311|179 +430|393 +14|82 +205|133 +198|343 +139|145 +470|142 +5|191 +429|351 +54|\N +485|24 +203|\N +359|146 +35|288 +126|234 +47|392 +170|487 +361|125 +322|335 +54|345 +453|9 +268|64 +117|402 +467|241 +\N|203 +431|490 +332|258 +322|\N +123|76 +313|200 +354|272 +\N|231 +102|444 +266|\N +226|463 +66|377 +194|\N +310|362 +209|314 +239|346 +317|130 +112|444 +12|254 +350|172 +369|402 +482|398 +427|171 +65|409 +304|135 +254|416 +79|359 +204|286 +\N|87 +175|159 +272|306 +265|441 +54|40 +336|311 +173|97 +84|220 +184|383 +196|192 +27|98 +162|4 +104|181 +153|320 +153|\N +106|329 +34|70 +228|227 +284|144 +453|284 +287|199 +82|\N +53|104 +436|340 +344|256 +410|215 +145|373 +95|427 +71|241 +101|436 +69|203 +389|231 +290|134 +279|103 +7|256 +405|132 +498|371 +\N|3 +438|101 +15|17 +338|297 +299|140 +62|\N +188|\N +138|55 +445|135 +425|26 +\N|398 +341|331 +160|313 +\N|76 +355|228 +163|5 +111|217 +62|151 +460|495 +411|437 +200|421 +163|\N +440|426 +151|281 +493|352 +352|103 +445|465 +176|380 +\N|198 +195|219 +468|\N +380|439 +61|307 +403|388 +\N|359 +69|410 +354|456 +491|80 +310|374 +162|426 +277|81 +176|463 +226|469 +446|79 +477|26 +86|231 +379|456 +414|251 +373|114 +499|416 +490|104 +65|237 +\N|493 +450|189 +1|432 +33|178 +160|158 +480|362 +135|420 +73|286 +149|402 +244|472 +305|181 +227|98 +412|209 +59|255 +49|198 +105|483 +445|\N +59|24 +237|178 +453|37 +54|111 +465|456 +94|395 +406|420 +413|38 +85|436 +61|57 +15|437 +95|\N +460|155 +471|230 +482|499 +302|389 +\N|456 +168|157 +284|386 +385|211 +461|490 +65|229 +335|128 +415|420 +374|12 +315|90 +103|226 +20|277 +101|233 +237|180 +101|399 +268|242 +164|249 +373|4 +81|141 +325|221 +\N|\N +438|302 +206|339 +30|90 +\N|\N +30|149 +49|183 +13|83 +83|27 +411|\N +91|495 +260|239 +435|329 +330|457 +318|284 +298|327 +230|50 +68|139 +55|120 +40|117 +185|\N +351|483 +242|199 +45|243 +341|491 +38|473 +289|474 +301|486 +59|272 +477|157 +108|379 +\N|232 +223|9 +388|187 +\N|211 +436|47 +500|410 +361|383 +228|455 +26|13 +\N|459 +396|153 +348|387 +420|39 +34|402 +183|249 +323|80 +36|147 +114|246 +457|383 +262|425 +253|460 +284|287 +48|486 +452|478 +327|362 +253|475 +190|217 +124|11 +67|485 +451|27 +478|256 +331|371 +88|451 +247|177 +479|221 +405|169 +85|315 +292|232 +100|44 +131|302 +\N|21 +204|284 +104|411 +482|444 +248|233 +425|159 +297|414 +18|385 +112|454 +22|164 +210|314 +267|116 +263|446 +171|294 +186|423 +181|339 +303|277 +51|485 +290|67 +\N|127 +63|143 +387|\N +\N|211 +286|69 +14|499 +100|430 +179|441 +473|22 +74|271 +106|294 +339|172 +58|423 +193|219 +267|59 +126|178 +356|185 +121|130 +413|103 +370|496 +364|196 +178|5 +124|437 +446|127 +151|313 +451|468 +419|106 +99|291 +\N|439 +327|493 +386|146 +\N|163 +\N|94 +327|278 +66|386 +\N|492 +461|146 +61|164 +273|146 +398|479 +499|65 +68|20 +163|65 +\N|58 +180|454 +401|5 +109|312 +268|475 +297|362 +137|178 +59|297 +74|\N +250|38 +137|244 +330|355 +456|62 +\N|292 +419|432 +166|214 +176|72 +167|459 +469|308 +425|299 +134|371 +98|336 +228|387 +409|119 +205|313 +308|317 +443|125 +259|432 +\N|95 +143|395 +224|416 +217|108 +29|386 +224|30 +378|43 +83|343 +43|202 +159|376 +495|425 +395|205 +459|161 +402|500 +304|84 +362|392 +176|187 +443|459 +226|185 +21|445 +500|\N +299|74 +0|208 +18|72 +483|320 +436|181 +338|47 +25|301 +461|54 +420|325 +219|148 +271|320 +378|45 +131|\N +97|142 +300|147 +165|228 +173|322 +337|247 +11|214 +325|199 +205|195 +\N|412 +211|36 +91|85 +281|97 +212|246 +258|354 +185|208 +11|310 +493|2 +238|327 +\N|480 +281|193 +442|373 +342|50 +357|171 +151|255 +477|273 +\N|251 +492|424 +185|325 +450|401 +241|435 +260|280 +500|122 +413|51 +76|360 +163|69 +186|200 +232|15 +259|179 +199|59 +261|82 +210|257 +453|275 +116|48 +464|382 +\N|485 +11|110 +302|324 +14|54 +85|1 +163|83 +\N|238 +356|244 +465|55 +329|455 +162|471 +316|459 +223|363 +258|321 +495|472 +373|56 +38|471 +36|430 +161|88 +459|258 +418|195 +105|319 +91|407 +365|55 +86|433 +240|467 +363|163 +343|68 +233|297 +484|282 diff --git a/regression-test/data/nereids_p0/hint/t4.csv b/regression-test/data/nereids_p0/hint/t4.csv new file mode 100644 index 0000000000..a473205388 --- /dev/null +++ b/regression-test/data/nereids_p0/hint/t4.csv @@ -0,0 +1,1000 @@ +141|422 +310|497 +10|317 +427|312 +286|263 +180|19 +265|224 +436|342 +455|379 +285|357 +490|79 +222|239 +124|22 +270|\N +190|266 +207|78 +380|63 +\N|9 +191|150 +6|385 +236|\N +8|182 +454|285 +141|160 +267|341 +215|322 +337|423 +488|105 +171|137 +120|314 +342|33 +295|351 +173|212 +80|2 +336|248 +383|423 +\N|122 +484|444 +\N|217 +134|10 +61|225 +362|115 +\N|\N +96|129 +404|194 +446|310 +127|299 +307|178 +477|428 +285|109 +434|292 +366|71 +384|469 +455|82 +220|423 +442|402 +355|474 +468|427 +435|90 +91|277 +61|463 +318|417 +\N|144 +328|150 +448|253 +69|258 +0|494 +93|195 +4|71 +16|374 +417|348 +463|\N +487|228 +479|399 +333|183 +109|17 +\N|343 +403|407 +141|136 +476|253 +396|287 +141|83 +363|181 +13|361 +\N|124 +235|49 +479|63 +316|428 +306|376 +293|364 +230|326 +237|361 +462|236 +139|245 +401|135 +\N|99 +13|194 +122|297 +81|332 +465|\N +51|367 +102|\N +221|\N +110|374 +97|198 +39|224 +330|365 +421|335 +72|164 +366|375 +360|375 +19|429 +282|179 +235|84 +465|198 +144|448 +335|108 +412|216 +267|328 +390|197 +388|266 +305|30 +427|131 +104|\N +284|349 +48|268 +404|81 +483|304 +371|62 +\N|345 +435|321 +137|26 +252|173 +389|394 +346|193 +37|140 +97|67 +175|343 +304|398 +219|471 +231|128 +\N|387 +167|411 +181|223 +166|240 +480|286 +293|365 +247|319 +267|363 +372|65 +239|32 +197|95 +24|\N +410|131 +180|196 +385|474 +175|272 +35|322 +170|46 +410|399 +168|456 +9|384 +262|493 +468|194 +141|227 +420|384 +95|183 +201|18 +320|456 +212|424 +69|280 +365|121 +25|\N +162|36 +479|223 +0|102 +101|277 +68|254 +343|150 +241|245 +367|360 +143|329 +241|157 +297|69 +369|281 +293|374 +450|170 +236|117 +226|327 +2|390 +101|278 +138|74 +91|311 +286|86 +59|218 +308|269 +203|370 +\N|446 +219|139 +212|175 +254|243 +135|104 +384|413 +231|234 +49|458 +300|183 +4|491 +177|105 +71|362 +154|188 +10|321 +266|\N +5|270 +160|202 +249|216 +472|21 +457|362 +481|291 +192|122 +203|353 +176|492 +\N|24 +419|114 +21|376 +300|185 +154|500 +12|64 +197|251 +75|367 +116|335 +47|278 +160|183 +52|403 +138|300 +343|301 +71|226 +32|485 +134|\N +449|236 +94|193 +240|414 +99|88 +138|372 +70|219 +6|348 +486|466 +99|27 +274|\N +394|500 +319|139 +401|242 +67|160 +4|93 +376|200 +471|447 +480|274 +\N|163 +401|469 +115|156 +26|286 +20|370 +167|410 +189|\N +69|411 +67|339 +193|66 +381|296 +159|341 +123|153 +\N|373 +123|190 +195|212 +20|354 +498|61 +164|154 +413|449 +34|246 +329|236 +\N|399 +287|299 +324|208 +138|32 +213|299 +256|264 +339|6 +95|\N +434|\N +335|331 +316|85 +355|436 +450|123 +345|343 +220|343 +165|160 +426|\N +155|385 +353|286 +398|294 +8|103 +326|384 +494|398 +247|120 +\N|435 +328|20 +436|156 +111|363 +91|456 +111|217 +24|470 +62|240 +147|\N +190|307 +384|364 +496|105 +286|225 +96|352 +452|258 +155|258 +288|86 +419|185 +366|45 +351|388 +68|431 +337|421 +381|408 +370|274 +279|98 +303|323 +77|90 +248|\N +234|20 +472|494 +186|257 +34|184 +40|321 +53|160 +368|123 +\N|164 +224|346 +80|474 +121|47 +483|68 +48|77 +42|334 +2|192 +368|231 +288|314 +290|168 +453|382 +239|324 +29|157 +57|21 +39|37 +201|208 +478|444 +270|59 +201|195 +435|425 +498|85 +169|224 +80|370 +251|224 +58|\N +463|89 +368|433 +60|128 +452|407 +19|239 +373|211 +85|468 +339|444 +141|133 +458|172 +218|486 +374|246 +14|246 +108|378 +181|39 +124|450 +272|209 +265|370 +324|61 +172|\N +\N|285 +338|118 +77|315 +101|281 +345|476 +95|172 +32|150 +91|475 +447|327 +447|29 +19|54 +143|\N +362|142 +181|479 +219|11 +451|127 +244|275 +493|155 +490|435 +254|30 +480|159 +45|97 +299|494 +90|141 +201|340 +338|71 +166|325 +429|499 +160|424 +497|412 +267|362 +139|69 +165|67 +393|332 +101|311 +415|196 +156|376 +118|259 +140|307 +316|361 +37|196 +402|285 +28|372 +139|321 +206|159 +308|161 +453|95 +189|166 +132|82 +367|413 +266|219 +359|177 +\N|248 +82|428 +230|97 +246|418 +138|\N +38|447 +91|292 +2|33 +296|228 +181|189 +\N|28 +138|283 +35|39 +84|113 +416|248 +183|\N +444|371 +290|278 +465|173 +31|268 +383|456 +474|21 +410|423 +192|468 +306|202 +62|263 +282|283 +472|43 +23|431 +154|339 +201|156 +309|163 +180|311 +1|276 +478|382 +217|441 +\N|409 +13|267 +471|464 +282|390 +264|441 +28|269 +270|174 +217|46 +232|23 +272|164 +21|299 +460|69 +177|387 +406|269 +32|157 +175|238 +303|21 +408|122 +357|441 +329|162 +356|205 +84|108 +1|375 +131|301 +354|433 +94|283 +427|141 +389|370 +463|145 +454|446 +372|\N +278|284 +316|63 +160|261 +399|275 +187|241 +480|266 +57|181 +324|266 +147|36 +228|306 +52|188 +120|52 +468|310 +68|458 +394|134 +\N|325 +144|217 +41|215 +73|226 +399|374 +278|77 +288|337 +451|64 +381|495 +265|348 +385|360 +111|479 +336|89 +179|472 +163|211 +106|465 +495|10 +294|455 +215|428 +209|131 +161|297 +437|292 +244|119 +11|442 +242|498 +151|0 +491|112 +302|262 +17|442 +337|499 +353|69 +339|52 +165|290 +15|494 +447|69 +343|141 +250|45 +309|164 +148|377 +226|469 +138|426 +66|260 +115|458 +272|17 +61|233 +62|500 +361|252 +181|143 +283|387 +333|460 +190|480 +103|89 +87|30 +80|104 +320|456 +259|\N +40|458 +403|327 +461|216 +168|394 +159|358 +401|138 +133|101 +308|353 +94|120 +30|25 +408|54 +120|58 +469|202 +276|217 +187|319 +11|22 +199|481 +\N|83 +118|187 +178|18 +259|230 +86|374 +83|253 +151|293 +427|63 +100|416 +428|63 +13|491 +197|53 +250|104 +324|328 +94|31 +132|221 +3|235 +463|76 +88|199 +113|104 +377|213 +\N|175 +2|438 +213|434 +44|358 +77|480 +423|128 +108|108 +303|160 +25|321 +321|466 +300|170 +475|359 +40|330 +65|10 +239|235 +108|389 +73|149 +379|123 +25|11 +56|132 +279|45 +\N|218 +422|498 +348|285 +320|329 +350|433 +479|362 +39|7 +\N|481 +342|122 +477|166 +163|444 +408|362 +214|128 +225|161 +428|\N +123|234 +174|457 +\N|250 +171|266 +499|294 +101|\N +248|88 +\N|302 +196|313 +398|204 +146|32 +460|\N +8|97 +255|213 +199|379 +250|36 +495|460 +88|273 +329|75 +179|198 +147|386 +216|155 +\N|200 +259|88 +155|3 +103|394 +46|\N +331|85 +155|144 +54|461 +93|216 +\N|413 +\N|335 +452|355 +449|398 +206|67 +225|411 +370|70 +91|107 +421|367 +306|36 +327|161 +375|20 +405|197 +482|308 +243|209 +36|290 +349|35 +309|425 +47|202 +399|249 +\N|5 +138|164 +456|464 +267|192 +398|73 +\N|418 +\N|474 +162|363 +300|38 +\N|37 +230|20 +469|187 +140|319 +\N|198 +230|456 +446|464 +\N|394 +426|399 +192|296 +386|345 +158|65 +436|263 +256|492 +224|410 +239|43 +187|57 +457|448 +13|288 +49|366 +234|435 +455|20 +306|34 +60|7 +210|485 +\N|399 +101|356 +96|410 +\N|455 +249|396 +448|186 +130|310 +168|489 +222|480 +104|146 +349|431 +379|336 +233|409 +53|415 +181|236 +120|239 +437|460 +117|352 +399|316 +224|159 +408|310 +463|140 +251|427 +239|213 +255|\N +380|\N +325|268 +\N|411 +204|\N +230|373 +64|484 +226|371 +404|464 +53|81 +188|479 +216|254 +17|172 +329|233 +75|377 +114|233 +124|\N +411|244 +219|173 +254|168 +96|\N +325|84 +321|109 +74|14 +311|168 +81|221 +489|466 +194|406 +297|234 +291|498 +442|408 +94|238 +183|193 +189|3 +352|434 +93|240 +475|\N +88|15 +407|\N +318|199 +216|9 +48|462 +450|167 +159|31 +100|313 +246|100 +\N|312 +290|457 +419|465 +478|348 +128|205 +130|238 +123|114 +351|391 +342|195 +67|148 +224|180 +106|432 +\N|29 +279|342 +93|94 +302|347 +67|213 +207|326 +197|90 +120|257 +163|\N +208|489 +386|287 +362|142 +394|455 +383|361 +50|54 +87|452 +72|340 +60|458 +219|353 +280|331 +222|405 +16|283 +\N|496 +256|475 +170|397 +188|386 +164|225 +178|238 +440|141 +424|184 +173|393 +339|205 +498|\N +229|281 +302|417 +42|223 +72|183 +155|256 +297|390 +241|107 +195|208 +128|411 +400|396 +319|69 +180|479 +429|99 +269|96 +460|228 +261|342 +454|247 +365|\N +496|437 +362|323 +485|433 +469|139 +443|320 +300|204 +219|447 +322|359 +183|320 +251|113 +31|388 +364|45 +171|68 +436|175 +72|385 +147|258 +6|389 +316|87 +39|381 +143|155 +387|17 +342|229 +48|134 +164|35 +460|442 +493|267 +395|400 +100|244 +292|5 +400|296 +144|326 +493|111 +391|500 +44|50 +230|361 +168|56 +210|\N +156|354 +457|470 +137|405 +238|119 +71|198 +54|29 +498|348 +29|201 +104|477 +378|121 +382|370 +498|160 +256|393 +165|22 +66|20 +57|385 +314|90 +150|63 +16|195 +445|220 +340|213 +145|29 +404|88 +94|235 +253|11 +199|464 +\N|318 +167|75 +127|49 +186|136 +274|198 +494|465 +96|347 +191|\N +431|421 +\N|113 +260|\N +116|259 +220|216 +113|455 +453|146 +2|444 +302|34 +\N|53 +302|37 +318|434 +73|485 +444|60 +287|301 +117|92 +167|323 +476|393 +21|229 +307|140 +130|440 +88|220 +361|47 +297|147 +307|290 +67|251 +8|311 +248|137 +79|463 +188|231 +445|62 +430|223 +\N|78 +485|365 +9|149 +304|302 +266|166 +\N|235 +346|8 +309|202 +475|420 +493|237 +211|\N +479|250 +425|\N +95|57 +3|242 +420|277 +\N|28 +132|194 +447|411 +480|210 +1|239 +378|101 +338|92 +491|250 +408|91 +31|153 +422|308 +283|364 +489|243 +167|493 +37|81 +491|285 diff --git a/regression-test/data/nereids_p0/hint/test_leading.out b/regression-test/data/nereids_p0/hint/test_leading.out index 3379b4a54e..b97e8e7b75 100644 --- a/regression-test/data/nereids_p0/hint/test_leading.out +++ b/regression-test/data/nereids_p0/hint/test_leading.out @@ -1,429 +1,2280 @@ -- This file is automatically generated. You should know what you did if you want to edit this --- !select1 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() ---------PhysicalOlapScan[t2] ---------PhysicalDistribute -----------PhysicalOlapScan[t1] +-- !select1_1 -- +1000 -Used: leading(t2 t1) +-- !select1_2 -- +1000 + +-- !select1_3 -- +1000 + +-- !select1_4 -- +1000 + +-- !select2_1 -- +1719 + +-- !select2_2 -- +1719 + +-- !select2_3 -- +1719 + +-- !select3_1 -- +3103 + +-- !select3_2 -- +3103 + +-- !select3_3 -- +3103 + +-- !select3_4 -- +3103 + +-- !select3_5 -- +3103 + +-- !select3_6 -- +3103 + +-- !select3_7 -- +3103 + +-- !select3_8 -- +3103 + +-- !select3_9 -- +3103 + +-- !select3_10 -- +3103 + +-- !select3_11 -- +3103 + +-- !select3_12 -- +3103 + +-- !select3_13 -- +3103 + +-- !select4_1 -- +6224 + +-- !select4_2 -- +6224 + +-- !select4_3 -- +6224 + +-- !select4_4 -- +6224 + +-- !select4_5 -- +6224 + +-- !select5_1 -- +426858 + +-- !select5_2 -- +426858 + +-- !select6_1 -- +1131009 + +-- !select6_2 -- +1131009 + +-- !select7_1 -- +3705 + +-- !select7_2 -- +3705 + +-- !select8_1 -- +1577 + +-- !select8_2 -- +1577 + +-- !select9_1 -- +1470 + +-- !select9_2 -- +1470 + +-- !select10_1 -- +1471 + +-- !select10_2 -- +1471 + +-- !select11_1 -- +415028 + +-- !select11_2 -- +415028 + +-- !select12_1 -- +3568 + +-- !select12_2 -- +3568 + +-- !select13_1 -- +1530 + +-- !select13_2 -- +1530 + +-- !select14_1 -- +1471 + +-- !select14_2 -- +1471 + +-- !select15_1 -- +1377 + +-- !select15_2 -- +1377 + +-- !select16_1 -- +3103 + +-- !select16_2 -- +3103 + +-- !select17_1 -- +3731 + +-- !select17_2 -- +3731 + +-- !select17_3 -- +3731 + +-- !select17_4 -- +3731 + +-- !select17_5 -- +3731 + +-- !select17_6 -- +3731 + +-- !select17_7 -- +3731 + +-- !select17_8 -- +3731 + +-- !select17_9 -- +3731 + +-- !select17_10 -- +3731 + +-- !select17_11 -- +3731 + +-- !select17_12 -- +3731 + +-- !select17_13 -- +3731 + +-- !select18_1 -- +3362 + +-- !select18_2 -- +3362 + +-- !select18_3 -- +3362 + +-- !select18_4 -- +3362 + +-- !select18_5 -- +3362 + +-- !select18_6 -- +3362 + +-- !select18_7 -- +3362 + +-- !select18_8 -- +3362 + +-- !select18_9 -- +3362 + +-- !select18_10 -- +3362 + +-- !select18_11 -- +3362 + +-- !select18_12 -- +3362 + +-- !select18_13 -- +3362 + +-- !select19_1 -- +3472 + +-- !select19_2 -- +3472 + +-- !select19_3 -- +3472 + +-- !select19_4 -- +3472 + +-- !select19_5 -- +3472 + +-- !select19_6 -- +3472 + +-- !select19_7 -- +3472 + +-- !select19_8 -- +3472 + +-- !select19_9 -- +3472 + +-- !select19_10 -- +3472 + +-- !select19_11 -- +3472 + +-- !select19_12 -- +3472 + +-- !select19_13 -- +3472 + +-- !select20_1 -- +1460 + +-- !select20_2 -- +1460 + +-- !select20_3 -- +1460 + +-- !select20_4 -- +1460 + +-- !select20_5 -- +1460 + +-- !select20_6 -- +1460 + +-- !select20_7 -- +1460 + +-- !select20_8 -- +1460 + +-- !select20_9 -- +1460 + +-- !select20_10 -- +1460 + +-- !select20_11 -- +1460 + +-- !select20_12 -- +1460 + +-- !select20_13 -- +1460 + +-- !select21_1 -- +259 + +-- !select21_2 -- +259 + +-- !select21_3 -- +259 + +-- !select21_4 -- +259 + +-- !select21_5 -- +259 + +-- !select21_6 -- +259 + +-- !select21_7 -- +259 + +-- !select21_8 -- +259 + +-- !select21_9 -- +259 + +-- !select21_10 -- +259 + +-- !select21_11 -- +259 + +-- !select21_12 -- +259 + +-- !select21_13 -- +259 + +-- !select22_1 -- +3568 + +-- !select22_2 -- +3568 + +-- !select22_3 -- +3568 + +-- !select22_4 -- +3568 + +-- !select22_5 -- +3568 + +-- !select22_6 -- +3568 + +-- !select22_7 -- +3568 + +-- !select22_8 -- +3568 + +-- !select22_9 -- +3568 + +-- !select22_10 -- +3568 + +-- !select22_11 -- +3568 + +-- !select22_12 -- +3568 + +-- !select22_13 -- +3568 + +-- !select23_1 -- +3472 + +-- !select23_2 -- +3472 + +-- !select23_3 -- +3472 + +-- !select23_4 -- +3472 + +-- !select23_5 -- +3472 + +-- !select23_6 -- +3472 + +-- !select23_7 -- +3472 + +-- !select23_8 -- +3472 + +-- !select23_9 -- +3472 + +-- !select23_10 -- +3472 + +-- !select23_11 -- +3472 + +-- !select23_12 -- +3472 + +-- !select23_13 -- +3472 + +-- !select24_1 -- +1460 + +-- !select24_2 -- +1460 + +-- !select24_3 -- +1460 + +-- !select24_4 -- +1460 + +-- !select24_5 -- +1460 + +-- !select24_6 -- +1460 + +-- !select24_7 -- +1460 + +-- !select24_8 -- +1460 + +-- !select24_9 -- +1460 + +-- !select24_10 -- +1460 + +-- !select24_11 -- +1460 + +-- !select24_12 -- +1460 + +-- !select24_13 -- +1460 + +-- !select25_1 -- +465 + +-- !select25_2 -- +465 + +-- !select25_3 -- +465 + +-- !select25_4 -- +465 + +-- !select25_5 -- +465 + +-- !select25_6 -- +465 + +-- !select25_7 -- +465 + +-- !select25_8 -- +465 + +-- !select25_9 -- +465 + +-- !select25_10 -- +465 + +-- !select25_11 -- +465 + +-- !select25_12 -- +465 + +-- !select25_13 -- +465 + +-- !select26_1 -- +1643 + +-- !select26_2 -- +1643 + +-- !select26_3 -- +1643 + +-- !select26_4 -- +1643 + +-- !select26_5 -- +1643 + +-- !select26_6 -- +1643 + +-- !select26_7 -- +1643 + +-- !select26_8 -- +1643 + +-- !select26_9 -- +1643 + +-- !select26_10 -- +1643 + +-- !select26_11 -- +1643 + +-- !select26_12 -- +1643 + +-- !select26_13 -- +1643 + +-- !select27_1 -- +337 + +-- !select27_2 -- +337 + +-- !select27_3 -- +337 + +-- !select27_4 -- +337 + +-- !select27_5 -- +337 + +-- !select27_6 -- +337 + +-- !select27_7 -- +337 + +-- !select27_8 -- +337 + +-- !select27_9 -- +337 + +-- !select27_10 -- +337 + +-- !select27_11 -- +337 + +-- !select27_12 -- +337 + +-- !select27_13 -- +337 + +-- !select28_1 -- +119 + +-- !select28_2 -- +119 + +-- !select28_3 -- +119 + +-- !select28_4 -- +119 + +-- !select28_5 -- +119 + +-- !select28_6 -- +119 + +-- !select28_7 -- +119 + +-- !select28_8 -- +119 + +-- !select28_9 -- +119 + +-- !select28_10 -- +119 + +-- !select28_11 -- +119 + +-- !select28_12 -- +119 + +-- !select28_13 -- +119 + +-- !select32_1 -- +6224 + +-- !select32_2 -- +6224 + +-- !select32_3 -- +6224 + +-- !select32_4 -- +6224 + +-- !select32_5 -- +6224 + +-- !select32_6 -- +6224 + +-- !select32_7 -- +6224 + +-- !select32_8 -- +6224 + +-- !select32_9 -- +6224 + +-- !select32_10 -- +6224 + +-- !select32_11 -- +6224 + +-- !select32_12 -- +6224 + +-- !select32_13 -- +6224 + +-- !select33_1 -- +6839 + +-- !select33_2 -- +6839 + +-- !select33_3 -- +6839 + +-- !select33_4 -- +6839 + +-- !select33_5 -- +6839 + +-- !select33_6 -- +6839 + +-- !select33_7 -- +6839 + +-- !select33_8 -- +6839 + +-- !select33_9 -- +6839 + +-- !select33_10 -- +6839 + +-- !select33_11 -- +6839 + +-- !select33_12 -- +6839 + +-- !select33_13 -- +6839 + +-- !select34_1 -- +2853 + +-- !select34_2 -- +2853 + +-- !select34_3 -- +2853 + +-- !select34_4 -- +2853 + +-- !select34_5 -- +2853 + +-- !select34_6 -- +2853 + +-- !select34_7 -- +2853 + +-- !select34_8 -- +2853 + +-- !select34_9 -- +2853 + +-- !select34_10 -- +2853 + +-- !select34_11 -- +2853 + +-- !select34_12 -- +2853 + +-- !select34_13 -- +2853 + +-- !select35_1 -- +793 + +-- !select35_2 -- +793 + +-- !select35_3 -- +793 + +-- !select35_4 -- +793 + +-- !select35_5 -- +793 + +-- !select35_6 -- +793 + +-- !select35_7 -- +793 + +-- !select35_8 -- +793 + +-- !select35_9 -- +793 + +-- !select35_10 -- +793 + +-- !select35_11 -- +793 + +-- !select35_12 -- +793 + +-- !select35_13 -- +793 + +-- !select36_1 -- +2853 + +-- !select36_2 -- +2853 + +-- !select36_3 -- +2853 + +-- !select36_4 -- +2853 + +-- !select36_5 -- +2853 + +-- !select36_6 -- +2853 + +-- !select36_7 -- +2853 + +-- !select36_8 -- +2853 + +-- !select36_9 -- +2853 + +-- !select36_10 -- +2853 + +-- !select36_11 -- +2853 + +-- !select36_12 -- +2853 + +-- !select36_13 -- +2853 + +-- !select37_1 -- +486 + +-- !select37_2 -- +486 + +-- !select37_3 -- +486 + +-- !select37_4 -- +486 + +-- !select37_5 -- +486 + +-- !select37_6 -- +486 + +-- !select37_7 -- +486 + +-- !select37_8 -- +486 + +-- !select37_9 -- +486 + +-- !select37_10 -- +486 + +-- !select37_11 -- +486 + +-- !select37_12 -- +486 + +-- !select37_13 -- +486 + +-- !select38_1 -- +201 + +-- !select38_2 -- +201 + +-- !select38_3 -- +201 + +-- !select38_4 -- +201 + +-- !select38_5 -- +201 + +-- !select38_6 -- +201 + +-- !select38_7 -- +201 + +-- !select38_8 -- +201 + +-- !select38_9 -- +201 + +-- !select38_10 -- +201 + +-- !select38_11 -- +201 + +-- !select38_12 -- +201 + +-- !select38_13 -- +201 + +-- !select42_1 -- +6224 + +-- !select42_2 -- +6224 + +-- !select42_3 -- +6224 + +-- !select42_4 -- +6224 + +-- !select42_5 -- +6224 + +-- !select42_6 -- +6224 + +-- !select42_7 -- +6224 + +-- !select42_8 -- +6224 + +-- !select42_9 -- +6224 + +-- !select42_10 -- +6224 + +-- !select42_11 -- +6224 + +-- !select42_12 -- +6224 + +-- !select42_13 -- +6224 + +-- !select43_1 -- +6839 + +-- !select43_2 -- +6839 + +-- !select43_3 -- +6839 + +-- !select43_4 -- +6839 + +-- !select43_5 -- +6839 + +-- !select43_6 -- +6839 + +-- !select43_7 -- +6839 + +-- !select43_8 -- +6839 + +-- !select43_9 -- +6839 + +-- !select43_10 -- +6839 + +-- !select43_11 -- +6839 + +-- !select43_12 -- +6839 + +-- !select43_13 -- +6839 + +-- !select44_1 -- +2853 + +-- !select44_2 -- +2853 + +-- !select44_3 -- +2853 + +-- !select44_4 -- +2853 + +-- !select44_5 -- +2853 + +-- !select44_6 -- +2853 + +-- !select44_7 -- +2853 + +-- !select44_8 -- +2853 + +-- !select44_9 -- +2853 + +-- !select44_10 -- +2853 + +-- !select44_11 -- +2853 + +-- !select44_12 -- +2853 + +-- !select44_13 -- +2853 + +-- !select45_1 -- +793 + +-- !select45_2 -- +793 + +-- !select45_3 -- +793 + +-- !select45_4 -- +793 + +-- !select45_5 -- +793 + +-- !select45_6 -- +793 + +-- !select45_7 -- +793 + +-- !select45_8 -- +793 + +-- !select45_9 -- +793 + +-- !select45_10 -- +793 + +-- !select45_11 -- +793 + +-- !select45_12 -- +793 + +-- !select45_13 -- +793 + +-- !select46_1 -- +2853 + +-- !select46_2 -- +2853 + +-- !select46_3 -- +2853 + +-- !select46_4 -- +2853 + +-- !select46_5 -- +2853 + +-- !select46_6 -- +2853 + +-- !select46_7 -- +2853 + +-- !select46_8 -- +2853 + +-- !select46_9 -- +2853 + +-- !select46_10 -- +2853 + +-- !select46_11 -- +2853 + +-- !select46_12 -- +2853 + +-- !select46_13 -- +2853 + +-- !select47_1 -- +486 + +-- !select47_2 -- +486 + +-- !select47_3 -- +486 + +-- !select47_4 -- +486 + +-- !select47_5 -- +486 + +-- !select47_6 -- +486 + +-- !select47_7 -- +486 + +-- !select47_8 -- +486 + +-- !select47_9 -- +486 + +-- !select47_10 -- +486 + +-- !select47_11 -- +486 + +-- !select47_12 -- +486 + +-- !select47_13 -- +486 + +-- !select48_1 -- +201 + +-- !select48_2 -- +201 + +-- !select48_3 -- +201 + +-- !select48_4 -- +201 + +-- !select48_5 -- +201 + +-- !select48_6 -- +201 + +-- !select48_7 -- +201 + +-- !select48_8 -- +201 + +-- !select48_9 -- +201 + +-- !select48_10 -- +201 + +-- !select48_11 -- +201 + +-- !select48_12 -- +201 + +-- !select48_13 -- +201 + +-- !select49_1 -- +6690 + +-- !select49_2 -- +6690 + +-- !select49_3 -- +6690 + +-- !select49_4 -- +6690 + +-- !select49_5 -- +6690 + +-- !select49_6 -- +6690 + +-- !select50_1 -- +1719000 + +-- !select50_2 -- +1719000 + +-- !select50_3 -- +1719000 + +-- !select50_4 -- +1719000 + +-- !select51_1 -- +232 + +-- !select51_2 -- +232 + +-- !select51_3 -- +232 + +-- !select51_4 -- +232 + +-- !select51_5 -- +232 + +-- !select51_6 -- +232 + +-- !select51_7 -- +232 + +-- !select51_8 -- +232 + +-- !select51_9 -- +232 + +-- !select51_10 -- +232 + +-- !select51_11 -- +232 + +-- !select51_12 -- +232 + +-- !select51_13 -- +232 + +-- !select52_1 -- +2993 + +-- !select52_2 -- +2993 + +-- !select52_3 -- +2993 + +-- !select52_4 -- +2993 + +-- !select52_5 -- +2993 + +-- !select52_6 -- +2993 + +-- !select52_7 -- +2993 + +-- !select52_8 -- +2993 + +-- !select52_9 -- +2993 + +-- !select52_10 -- +2993 + +-- !select52_11 -- +2993 + +-- !select52_12 -- +2993 + +-- !select52_13 -- +2993 + +-- !select53_1 -- +2637 + +-- !select53_2 -- +2637 + +-- !select53_3 -- +2637 + +-- !select53_4 -- +2637 + +-- !select53_5 -- +2637 + +-- !select53_6 -- +2637 + +-- !select53_7 -- +2637 + +-- !select53_8 -- +2637 + +-- !select53_9 -- +2637 + +-- !select53_10 -- +2637 + +-- !select53_11 -- +2637 + +-- !select53_12 -- +2637 + +-- !select53_13 -- +2637 + +-- !select54_1 -- +1235 + +-- !select54_2 -- +1235 + +-- !select54_3 -- +1235 + +-- !select54_4 -- +1235 + +-- !select54_5 -- +1235 + +-- !select54_6 -- +1235 + +-- !select54_7 -- +1235 + +-- !select54_8 -- +1235 + +-- !select54_9 -- +1235 + +-- !select54_10 -- +1235 + +-- !select54_11 -- +1235 + +-- !select54_12 -- +1235 + +-- !select54_13 -- +1235 + +-- !select55_1 -- +356 + +-- !select55_2 -- +356 + +-- !select55_3 -- +356 + +-- !select55_4 -- +356 + +-- !select55_5 -- +356 + +-- !select55_6 -- +356 + +-- !select55_7 -- +356 + +-- !select55_8 -- +356 + +-- !select55_9 -- +356 + +-- !select55_10 -- +356 + +-- !select55_11 -- +356 + +-- !select55_12 -- +356 + +-- !select55_13 -- +356 + +-- !select56_1 -- +1235 + +-- !select56_2 -- +1235 + +-- !select56_3 -- +1235 + +-- !select56_4 -- +1235 + +-- !select56_5 -- +1235 + +-- !select56_6 -- +1235 + +-- !select56_7 -- +1235 + +-- !select56_8 -- +1235 + +-- !select56_9 -- +1235 + +-- !select56_10 -- +1235 + +-- !select56_11 -- +1235 + +-- !select56_12 -- +1235 + +-- !select56_13 -- +1235 + +-- !select57_1 -- +232 + +-- !select57_2 -- +232 + +-- !select57_3 -- +232 + +-- !select57_4 -- +232 + +-- !select57_5 -- +232 + +-- !select57_6 -- +232 + +-- !select57_7 -- +232 + +-- !select57_8 -- +232 + +-- !select57_9 -- +232 + +-- !select57_10 -- +232 + +-- !select57_11 -- +232 + +-- !select57_12 -- +232 + +-- !select57_13 -- +232 + +-- !select58_1 -- +105 + +-- !select58_2 -- +105 + +-- !select58_3 -- +105 + +-- !select58_4 -- +105 + +-- !select58_5 -- +105 + +-- !select58_6 -- +105 + +-- !select58_7 -- +105 + +-- !select58_8 -- +105 + +-- !select58_9 -- +105 + +-- !select58_10 -- +105 + +-- !select58_11 -- +105 + +-- !select58_12 -- +105 + +-- !select58_13 -- +105 + +-- !select61_1 -- +259 + +-- !select61_2 -- +259 + +-- !select61_3 -- +259 + +-- !select61_4 -- +259 + +-- !select61_5 -- +259 + +-- !select61_6 -- +259 + +-- !select61_7 -- +259 + +-- !select61_8 -- +259 + +-- !select61_9 -- +259 + +-- !select61_10 -- +259 + +-- !select61_11 -- +259 + +-- !select61_12 -- +259 + +-- !select61_13 -- +259 + +-- !select62_1 -- +3568 + +-- !select62_2 -- +3568 + +-- !select62_3 -- +3568 + +-- !select62_4 -- +3568 + +-- !select62_5 -- +3568 + +-- !select62_6 -- +3568 + +-- !select62_7 -- +3568 + +-- !select62_8 -- +3568 + +-- !select62_9 -- +3568 + +-- !select62_10 -- +3568 + +-- !select62_11 -- +3568 + +-- !select62_12 -- +3568 + +-- !select62_13 -- +3568 + +-- !select63_1 -- +3472 + +-- !select63_2 -- +3472 + +-- !select63_3 -- +3472 + +-- !select63_4 -- +3472 + +-- !select63_5 -- +3472 + +-- !select63_6 -- +3472 + +-- !select63_7 -- +3472 + +-- !select63_8 -- +3472 + +-- !select63_9 -- +3472 + +-- !select63_10 -- +3472 + +-- !select63_11 -- +3472 + +-- !select63_12 -- +3472 + +-- !select63_13 -- +3472 + +-- !select64_1 -- +1460 + +-- !select64_2 -- +1460 + +-- !select64_3 -- +1460 + +-- !select64_4 -- +1460 + +-- !select64_5 -- +1460 + +-- !select64_6 -- +1460 + +-- !select64_7 -- +1460 + +-- !select64_8 -- +1460 + +-- !select64_9 -- +1460 + +-- !select64_10 -- +1460 + +-- !select64_11 -- +1460 + +-- !select64_12 -- +1460 + +-- !select64_13 -- +1460 + +-- !select65_1 -- +465 + +-- !select65_2 -- +465 + +-- !select65_3 -- +465 + +-- !select65_4 -- +465 + +-- !select65_5 -- +465 + +-- !select65_6 -- +465 + +-- !select65_7 -- +465 + +-- !select65_8 -- +465 + +-- !select65_9 -- +465 + +-- !select65_10 -- +465 + +-- !select65_11 -- +465 + +-- !select65_12 -- +465 + +-- !select65_13 -- +465 + +-- !select66_1 -- +1643 + +-- !select66_2 -- +1643 + +-- !select66_3 -- +1643 + +-- !select66_4 -- +1643 + +-- !select66_5 -- +1643 + +-- !select66_6 -- +1643 + +-- !select66_7 -- +1643 + +-- !select66_8 -- +1643 + +-- !select66_9 -- +1643 + +-- !select66_10 -- +1643 + +-- !select66_11 -- +1643 + +-- !select66_12 -- +1643 + +-- !select66_13 -- +1643 + +-- !select67_1 -- +337 + +-- !select67_2 -- +337 + +-- !select67_3 -- +337 + +-- !select67_4 -- +337 + +-- !select67_5 -- +337 + +-- !select67_6 -- +337 + +-- !select67_7 -- +337 + +-- !select67_8 -- +337 + +-- !select67_9 -- +337 + +-- !select67_10 -- +337 + +-- !select67_11 -- +337 + +-- !select67_12 -- +337 + +-- !select67_13 -- +337 + +-- !select68_1 -- +119 + +-- !select68_2 -- +119 + +-- !select68_3 -- +119 + +-- !select68_4 -- +119 + +-- !select68_5 -- +119 + +-- !select68_6 -- +119 + +-- !select68_7 -- +119 + +-- !select68_8 -- +119 + +-- !select68_9 -- +119 + +-- !select68_10 -- +119 + +-- !select68_11 -- +119 + +-- !select68_12 -- +119 + +-- !select68_13 -- +119 + +-- !select70_1 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----PhysicalDistribute +------hashAgg[LOCAL] +--------PhysicalProject +----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() +------------PhysicalProject +--------------PhysicalOlapScan[t1] +------------PhysicalDistribute +--------------PhysicalProject +----------------PhysicalOlapScan[t2] + +Hint log: +Used: +UnUsed: +SyntaxError: leading(t1 t3) Msg:can not find table: t3 + +-- !select70_2 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----PhysicalDistribute +------hashAgg[LOCAL] +--------PhysicalProject +----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() +------------PhysicalProject +--------------PhysicalOlapScan[t1] +------------PhysicalDistribute +--------------PhysicalProject +----------------PhysicalOlapScan[t2] + +Hint log: +Used: +UnUsed: +SyntaxError: leading(t1 t5) Msg:can not find table: t5 + +-- !select71_1 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----PhysicalDistribute +------hashAgg[LOCAL] +--------PhysicalProject +----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() +------------PhysicalProject +--------------PhysicalOlapScan[t1] +------------PhysicalDistribute +--------------PhysicalProject +----------------PhysicalOlapScan[t2] + +Hint log: +Used: +UnUsed: +SyntaxError: leading(t1 t1 t2) Msg:duplicated table + +-- !select71_2 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----PhysicalDistribute +------hashAgg[LOCAL] +--------PhysicalProject +----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() +------------PhysicalProject +--------------PhysicalOlapScan[t1] +------------PhysicalDistribute +--------------PhysicalProject +----------------PhysicalOlapScan[t2] + +Hint log: +Used: +UnUsed: +SyntaxError: leading(t1 t2 t2) Msg:duplicated table + +-- !select72_1 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----PhysicalDistribute +------hashAgg[LOCAL] +--------PhysicalProject +----------hashJoin[LEFT_SEMI_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() +------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() +--------------PhysicalProject +----------------PhysicalOlapScan[t1] +--------------PhysicalDistribute +----------------PhysicalProject +------------------PhysicalOlapScan[t2] +------------PhysicalDistribute +--------------PhysicalProject +----------------hashJoin[INNER_JOIN] hashCondition=((t3.c3 = t4.c4)) otherCondition=() +------------------PhysicalProject +--------------------PhysicalOlapScan[t4] +------------------PhysicalDistribute +--------------------PhysicalProject +----------------------PhysicalOlapScan[t3] + +Hint log: +Used: leading(t4 t3) UnUsed: SyntaxError: --- !select2 -- +-- !select72_2 -- PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() ---------PhysicalOlapScan[t1] ---------PhysicalDistribute -----------PhysicalOlapScan[t2] +--hashAgg[GLOBAL] +----PhysicalDistribute +------hashAgg[LOCAL] +--------PhysicalProject +----------hashJoin[LEFT_SEMI_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() +------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() +--------------PhysicalProject +----------------PhysicalOlapScan[t1] +--------------PhysicalDistribute +----------------PhysicalProject +------------------PhysicalOlapScan[t2] +------------PhysicalDistribute +--------------PhysicalProject +----------------hashJoin[INNER_JOIN] hashCondition=((t3.c3 = t4.c4)) otherCondition=() +------------------PhysicalProject +--------------------PhysicalOlapScan[t3] +------------------PhysicalDistribute +--------------------PhysicalProject +----------------------PhysicalOlapScan[t4] +Hint log: Used: leading(t1 t2) UnUsed: SyntaxError: --- !select3 -- +-- !select73_1 -- PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))otherCondition=() ---------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() -----------PhysicalOlapScan[t1] -----------PhysicalDistribute -------------PhysicalOlapScan[t2] ---------PhysicalDistribute -----------PhysicalOlapScan[t3] - -Used: leading(t1 t2 t3) -UnUsed: -SyntaxError: - --- !select4 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() ---------PhysicalOlapScan[t1] ---------PhysicalDistribute -----------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))otherCondition=() -------------PhysicalOlapScan[t2] -------------PhysicalDistribute ---------------PhysicalOlapScan[t3] - -Used: leading(t1 { t2 t3 }) -UnUsed: -SyntaxError: - --- !select5 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[INNER_JOIN] hashCondition=((t3.c3 = t4.c4))otherCondition=() ---------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() -----------PhysicalOlapScan[t1] -----------PhysicalDistribute -------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))otherCondition=() ---------------PhysicalOlapScan[t2] ---------------PhysicalDistribute -----------------PhysicalOlapScan[t3] ---------PhysicalDistribute -----------PhysicalOlapScan[t4] - -Used: leading(t1 { t2 t3 } t4) -UnUsed: -SyntaxError: - --- !select6 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))otherCondition=() ---------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() -----------PhysicalOlapScan[t1] -----------PhysicalDistribute -------------PhysicalOlapScan[t2] ---------PhysicalDistribute -----------hashJoin[INNER_JOIN] hashCondition=((t3.c3 = t4.c4))otherCondition=() -------------PhysicalOlapScan[t3] -------------PhysicalDistribute ---------------PhysicalOlapScan[t4] - -Used: leading({ t1 t2 } { t3 t4 }) -UnUsed: -SyntaxError: - --- !select7 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))otherCondition=() ---------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() -----------PhysicalOlapScan[t1] -----------PhysicalDistribute -------------PhysicalOlapScan[t2] ---------PhysicalDistribute -----------hashJoin[INNER_JOIN] hashCondition=((t3.c3 = t4.c4))otherCondition=() -------------PhysicalOlapScan[t3] -------------PhysicalDistribute ---------------PhysicalOlapScan[t4] - -Used: leading({ t1 t2 } { t3 t4 }) -UnUsed: -SyntaxError: - --- !select8 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t3.c3))otherCondition=() ---------hashJoin[LEFT_OUTER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() -----------PhysicalOlapScan[t1] -----------PhysicalDistribute -------------PhysicalOlapScan[t2] ---------PhysicalDistribute -----------PhysicalOlapScan[t3] - --- !select9 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[LEFT_OUTER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() ---------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t3.c3))otherCondition=() -----------PhysicalOlapScan[t1] -----------PhysicalDistribute -------------PhysicalOlapScan[t3] ---------PhysicalDistribute -----------PhysicalOlapScan[t2] - -Used: leading(t1 t3 t2) -UnUsed: -SyntaxError: - --- !select10 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[LEFT_OUTER_JOIN] hashCondition=((t1.c1 = t3.c3))otherCondition=() ---------hashJoin[LEFT_OUTER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() -----------PhysicalOlapScan[t1] -----------PhysicalDistribute -------------PhysicalOlapScan[t2] ---------PhysicalDistribute -----------PhysicalOlapScan[t3] - --- !select11 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[LEFT_OUTER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() ---------hashJoin[LEFT_OUTER_JOIN] hashCondition=((t1.c1 = t3.c3))otherCondition=() -----------PhysicalOlapScan[t1] -----------PhysicalDistribute -------------PhysicalOlapScan[t3] ---------PhysicalDistribute -----------PhysicalOlapScan[t2] - -Used: leading(t1 t3 t2) -UnUsed: -SyntaxError: - --- !select12 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[RIGHT_OUTER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() ---------hashJoin[LEFT_OUTER_JOIN] hashCondition=((t2.c2 = t3.c3))otherCondition=() -----------PhysicalOlapScan[t2] -----------PhysicalDistribute -------------PhysicalOlapScan[t3] ---------PhysicalDistribute -----------PhysicalOlapScan[t1] - -Used: -UnUsed: leading(t1 { t2 t3 }) -SyntaxError: - --- !select13 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() ---------PhysicalOlapScan[t1] ---------PhysicalDistribute -----------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))otherCondition=() -------------PhysicalOlapScan[t2] -------------PhysicalDistribute ---------------PhysicalOlapScan[t3] - -Used: leading(t1 { t2 t3 }) -UnUsed: -SyntaxError: - --- !select14 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[RIGHT_OUTER_JOIN] hashCondition=((t1.c1 = tmp.c2))otherCondition=() ---------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))otherCondition=() -----------PhysicalOlapScan[t2] -----------PhysicalDistribute -------------PhysicalOlapScan[t3] ---------PhysicalDistribute -----------PhysicalOlapScan[t1] - --- !select15 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[RIGHT_OUTER_JOIN] hashCondition=((t1.c1 = tmp.c2))otherCondition=() ---------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))otherCondition=() -----------PhysicalOlapScan[t2] -----------PhysicalDistribute -------------PhysicalOlapScan[t3] ---------PhysicalDistribute -----------PhysicalOlapScan[t1] - -Used: -UnUsed: leading(t1 t2 t3) -SyntaxError: - --- !select16 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[LEFT_SEMI_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() ---------PhysicalOlapScan[t1] ---------PhysicalDistribute -----------PhysicalProject -------------PhysicalOlapScan[t2] - --- !select17 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[RIGHT_SEMI_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() +--hashAgg[GLOBAL] +----PhysicalDistribute +------hashAgg[LOCAL] --------PhysicalProject -----------PhysicalOlapScan[t2] ---------PhysicalDistribute -----------PhysicalOlapScan[t1] - -Used: leading(t2 t1) -UnUsed: -SyntaxError: - --- !select18 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------NestedLoopJoin[CROSS_JOIN] ---------PhysicalOlapScan[t1] ---------PhysicalDistribute -----------PhysicalLimit -------------PhysicalDistribute ---------------PhysicalLimit +----------hashJoin[LEFT_SEMI_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=() +------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() +--------------PhysicalProject +----------------PhysicalOlapScan[t1] +--------------PhysicalDistribute ----------------PhysicalProject ------------------PhysicalOlapScan[t2] +------------PhysicalDistribute +--------------PhysicalProject +----------------hashJoin[INNER_JOIN] hashCondition=((t3.c3 = t4.c4)) otherCondition=() +------------------PhysicalProject +--------------------PhysicalOlapScan[t4] +------------------PhysicalDistribute +--------------------PhysicalProject +----------------------PhysicalOlapScan[t3] --- !select19 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------NestedLoopJoin[CROSS_JOIN] ---------PhysicalProject -----------PhysicalOlapScan[t2] ---------PhysicalDistribute -----------PhysicalOlapScan[t1] - -Used: leading(t2 t1) +Hint log: +Used: leading(t1 t2) leading(t4 t3) UnUsed: SyntaxError: --- !select20 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------NestedLoopJoin[CROSS_JOIN] ---------hashJoin[INNER_JOIN] hashCondition=((cte.c1 = cte.c2))otherCondition=() -----------PhysicalProject -------------PhysicalOlapScan[t1] -----------PhysicalDistribute -------------PhysicalProject ---------------PhysicalOlapScan[t2] ---------PhysicalDistribute -----------PhysicalOlapScan[t2] +-- !select81_1 -- +259 --- !select21 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------NestedLoopJoin[CROSS_JOIN] ---------NestedLoopJoin[CROSS_JOIN](cte.c1 = cte.c2) -----------PhysicalProject -------------PhysicalOlapScan[t2] -----------PhysicalDistribute -------------PhysicalProject ---------------PhysicalOlapScan[t1] ---------PhysicalDistribute -----------PhysicalOlapScan[t3] +-- !select81_2 -- +259 -Used: leading(t2 t1 t3) -UnUsed: -SyntaxError: +-- !select81_3 -- +259 --- !select22 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() ---------PhysicalOlapScan[t1] ---------PhysicalDistribute -----------PhysicalOlapScan[t2] +-- !select81_4 -- +259 -Used: -UnUsed: -SyntaxError: leading(t66 t1) Msg:can not find table: t66 +-- !select81_5 -- +259 --- !select23 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() ---------PhysicalOlapScan[t1] ---------PhysicalDistribute -----------PhysicalOlapScan[t2] +-- !select81_6 -- +259 -Used: -UnUsed: -SyntaxError: leading(t3 t1) Msg:can not find table: t3 +-- !select81_7 -- +259 --- !select24 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------NestedLoopJoin[CROSS_JOIN] ---------hashJoin[INNER_JOIN] hashCondition=((cte.c1 = cte.c2))otherCondition=() -----------PhysicalProject -------------PhysicalOlapScan[t1] -----------PhysicalDistribute -------------PhysicalProject ---------------PhysicalOlapScan[t2] ---------PhysicalDistribute -----------PhysicalOlapScan[t2] +-- !select81_8 -- +259 -Used: -UnUsed: -SyntaxError: leading(t2 cte t1) Msg:tables should be same as join tables +-- !select81_9 -- +259 --- !select25 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))otherCondition=() ---------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() -----------PhysicalOlapScan[t1] -----------PhysicalDistribute -------------PhysicalOlapScan[t2] ---------PhysicalDistribute -----------PhysicalOlapScan[t3] +-- !select81_10 -- +259 -Used: -UnUsed: -SyntaxError: leading(t1 t2) Msg:tables should be same as join tables +-- !select81_11 -- +259 --- !select26 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))otherCondition=() ---------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))otherCondition=() -----------PhysicalOlapScan[t1] -----------PhysicalDistribute -------------PhysicalOlapScan[t2] ---------PhysicalDistribute -----------PhysicalOlapScan[t3] +-- !select81_12 -- +259 -Used: -UnUsed: -SyntaxError: leading(t1 t1 t2 t3) Msg:duplicated table +-- !select81_13 -- +259 --- !select27 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t_2.c2))otherCondition=() ---------PhysicalOlapScan[t1] ---------PhysicalDistribute -----------PhysicalOlapScan[t2] +-- !select82_1 -- +3568 -Used: leading(t1 t_2) -UnUsed: -SyntaxError: +-- !select82_2 -- +3568 --- !select28 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t_2.c2))otherCondition=() ---------PhysicalOlapScan[t1] ---------PhysicalDistribute -----------PhysicalOlapScan[t2] +-- !select82_3 -- +3568 -Used: -UnUsed: -SyntaxError: leading(t1 t2) Msg:can not find table: t2 +-- !select82_4 -- +3568 --- !select29 -- -PhysicalResultSink ---PhysicalDistribute -----PhysicalProject -------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t_1.c1))otherCondition=() ---------PhysicalOlapScan[t1] ---------PhysicalOlapScan[t1] +-- !select82_5 -- +3568 -Used: -UnUsed: -SyntaxError: leading(t1 t_1) Msg:tables should be same as join tables +-- !select82_6 -- +3568 +-- !select82_7 -- +3568 + +-- !select82_8 -- +3568 + +-- !select82_9 -- +3568 + +-- !select82_10 -- +3568 + +-- !select82_11 -- +3568 + +-- !select82_12 -- +3568 + +-- !select82_13 -- +3568 + +-- !select83_1 -- +3472 + +-- !select83_2 -- +3472 + +-- !select83_3 -- +3472 + +-- !select83_4 -- +3472 + +-- !select83_5 -- +3472 + +-- !select83_6 -- +3472 + +-- !select83_7 -- +3472 + +-- !select83_8 -- +3472 + +-- !select83_9 -- +3472 + +-- !select83_10 -- +3472 + +-- !select83_11 -- +3472 + +-- !select83_12 -- +3472 + +-- !select83_13 -- +3472 + +-- !select84_1 -- +1460 + +-- !select84_2 -- +1460 + +-- !select84_3 -- +1460 + +-- !select84_4 -- +1460 + +-- !select84_5 -- +1460 + +-- !select84_6 -- +1460 + +-- !select84_7 -- +1460 + +-- !select84_8 -- +1460 + +-- !select84_9 -- +1460 + +-- !select84_10 -- +1460 + +-- !select84_11 -- +1460 + +-- !select84_12 -- +1460 + +-- !select84_13 -- +1460 + +-- !select85_1 -- +465 + +-- !select85_2 -- +465 + +-- !select85_3 -- +465 + +-- !select85_4 -- +465 + +-- !select85_5 -- +465 + +-- !select85_6 -- +465 + +-- !select85_7 -- +465 + +-- !select85_8 -- +465 + +-- !select85_9 -- +465 + +-- !select85_10 -- +465 + +-- !select85_11 -- +465 + +-- !select85_12 -- +465 + +-- !select85_13 -- +465 + +-- !select86_1 -- +1643 + +-- !select86_2 -- +1643 + +-- !select86_3 -- +1643 + +-- !select86_4 -- +1643 + +-- !select86_5 -- +1643 + +-- !select86_6 -- +1643 + +-- !select86_7 -- +1643 + +-- !select86_8 -- +1643 + +-- !select86_9 -- +1643 + +-- !select86_10 -- +1643 + +-- !select86_11 -- +1643 + +-- !select86_12 -- +1643 + +-- !select86_13 -- +1643 + +-- !select87_1 -- +337 + +-- !select87_2 -- +337 + +-- !select87_3 -- +337 + +-- !select87_4 -- +337 + +-- !select87_5 -- +337 + +-- !select87_6 -- +337 + +-- !select87_7 -- +337 + +-- !select87_8 -- +337 + +-- !select87_9 -- +337 + +-- !select87_10 -- +337 + +-- !select87_11 -- +337 + +-- !select87_12 -- +337 + +-- !select87_13 -- +337 + +-- !select88_1 -- +119 + +-- !select88_2 -- +119 + +-- !select88_3 -- +119 + +-- !select88_4 -- +119 + +-- !select88_5 -- +119 + +-- !select88_6 -- +119 + +-- !select88_7 -- +119 + +-- !select88_8 -- +119 + +-- !select88_9 -- +119 + +-- !select88_10 -- +119 + +-- !select88_11 -- +119 + +-- !select88_12 -- +119 + +-- !select88_13 -- +119 diff --git a/regression-test/suites/nereids_hint_tpch_p0/load.groovy b/regression-test/suites/nereids_hint_tpch_p0/load.groovy deleted file mode 100644 index 0f78a93f5f..0000000000 --- a/regression-test/suites/nereids_hint_tpch_p0/load.groovy +++ /dev/null @@ -1,223 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -suite("load") { - String database = context.config.getDbNameByFile(context.file) - sql "drop database if exists ${database}" - sql "create database ${database}" - sql "use ${database}" - sql """ - drop table if exists lineitem; - """ - sql """ - CREATE TABLE lineitem ( - l_shipdate DATEV2 NOT NULL, - l_orderkey bigint NOT NULL, - l_linenumber int not null, - l_partkey int NOT NULL, - l_suppkey int not null, - l_quantity decimal(15, 2) NOT NULL, - l_extendedprice decimal(15, 2) NOT NULL, - l_discount decimal(15, 2) NOT NULL, - l_tax decimal(15, 2) NOT NULL, - l_returnflag VARCHAR(1) NOT NULL, - l_linestatus VARCHAR(1) NOT NULL, - l_commitdate DATEV2 NOT NULL, - l_receiptdate DATEV2 NOT NULL, - l_shipinstruct VARCHAR(25) NOT NULL, - l_shipmode VARCHAR(10) NOT NULL, - l_comment VARCHAR(44) NOT NULL - )ENGINE=OLAP - DUPLICATE KEY(`l_shipdate`, `l_orderkey`) - COMMENT "OLAP" - DISTRIBUTED BY HASH(`l_orderkey`) BUCKETS 96 - PROPERTIES ( - "replication_num" = "1", - "colocate_with" = "lineitem_orders" - ); - """ - - sql """ - drop table if exists orders; - """ - - sql ''' - CREATE TABLE orders ( - o_orderkey bigint NOT NULL, - o_orderdate DATEV2 NOT NULL, - o_custkey int NOT NULL, - o_orderstatus VARCHAR(1) NOT NULL, - o_totalprice decimal(15, 2) NOT NULL, - o_orderpriority VARCHAR(15) NOT NULL, - o_clerk VARCHAR(15) NOT NULL, - o_shippriority int NOT NULL, - o_comment VARCHAR(79) NOT NULL - )ENGINE=OLAP - DUPLICATE KEY(`o_orderkey`, `o_orderdate`) - COMMENT "OLAP" - DISTRIBUTED BY HASH(`o_orderkey`) BUCKETS 96 - PROPERTIES ( - "replication_num" = "1", - "colocate_with" = "lineitem_orders" - ); ''' - - sql ''' - drop table if exists partsupp; - ''' - - sql ''' - CREATE TABLE partsupp ( - ps_partkey int NOT NULL, - ps_suppkey int NOT NULL, - ps_availqty int NOT NULL, - ps_supplycost decimal(15, 2) NOT NULL, - ps_comment VARCHAR(199) NOT NULL - )ENGINE=OLAP - DUPLICATE KEY(`ps_partkey`) - COMMENT "OLAP" - DISTRIBUTED BY HASH(`ps_partkey`) BUCKETS 24 - PROPERTIES ( - "replication_num" = "1", - "colocate_with" = "part_partsupp" - ); - ''' - - sql ''' - drop table if exists part; - ''' - - sql ''' - CREATE TABLE part ( - p_partkey int NOT NULL, - p_name VARCHAR(55) NOT NULL, - p_mfgr VARCHAR(25) NOT NULL, - p_brand VARCHAR(10) NOT NULL, - p_type VARCHAR(25) NOT NULL, - p_size int NOT NULL, - p_container VARCHAR(10) NOT NULL, - p_retailprice decimal(15, 2) NOT NULL, - p_comment VARCHAR(23) NOT NULL - )ENGINE=OLAP - DUPLICATE KEY(`p_partkey`) - COMMENT "OLAP" - DISTRIBUTED BY HASH(`p_partkey`) BUCKETS 24 - PROPERTIES ( - "replication_num" = "1", - "colocate_with" = "part_partsupp" - ); - ''' - - sql ''' - drop table if exists customer; - ''' - - sql ''' - CREATE TABLE customer ( - c_custkey int NOT NULL, - c_name VARCHAR(25) NOT NULL, - c_address VARCHAR(40) NOT NULL, - c_nationkey int NOT NULL, - c_phone VARCHAR(15) NOT NULL, - c_acctbal decimal(15, 2) NOT NULL, - c_mktsegment VARCHAR(10) NOT NULL, - c_comment VARCHAR(117) NOT NULL - )ENGINE=OLAP - DUPLICATE KEY(`c_custkey`) - COMMENT "OLAP" - DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 24 - PROPERTIES ( - "replication_num" = "1" - ); - ''' - - sql ''' - drop table if exists supplier - ''' - - sql ''' - CREATE TABLE supplier ( - s_suppkey int NOT NULL, - s_name VARCHAR(25) NOT NULL, - s_address VARCHAR(40) NOT NULL, - s_nationkey int NOT NULL, - s_phone VARCHAR(15) NOT NULL, - s_acctbal decimal(15, 2) NOT NULL, - s_comment VARCHAR(101) NOT NULL - )ENGINE=OLAP - DUPLICATE KEY(`s_suppkey`) - COMMENT "OLAP" - DISTRIBUTED BY HASH(`s_suppkey`) BUCKETS 12 - PROPERTIES ( - "replication_num" = "1" - ); - ''' - - sql ''' - drop table if exists nation; - ''' - - sql ''' - CREATE TABLE `nation` ( - `n_nationkey` int(11) NOT NULL, - `n_name` varchar(25) NOT NULL, - `n_regionkey` int(11) NOT NULL, - `n_comment` varchar(152) NULL - ) ENGINE=OLAP - DUPLICATE KEY(`N_NATIONKEY`) - COMMENT "OLAP" - DISTRIBUTED BY HASH(`N_NATIONKEY`) BUCKETS 1 - PROPERTIES ( - "replication_num" = "1" - ); - ''' - - sql ''' - drop table if exists region; - ''' - - sql ''' - CREATE TABLE region ( - r_regionkey int NOT NULL, - r_name VARCHAR(25) NOT NULL, - r_comment VARCHAR(152) - )ENGINE=OLAP - DUPLICATE KEY(`r_regionkey`) - COMMENT "OLAP" - DISTRIBUTED BY HASH(`r_regionkey`) BUCKETS 1 - PROPERTIES ( - "replication_num" = "1" - ); - ''' - - sql ''' - drop view if exists revenue0; - ''' - - sql ''' - create view revenue0 (supplier_no, total_revenue) as - select - l_suppkey, - sum(l_extendedprice * (1 - l_discount)) - from - lineitem - where - l_shipdate >= date '1996-01-01' - and l_shipdate < date '1996-01-01' + interval '3' month - group by - l_suppkey; - ''' -} diff --git a/regression-test/suites/nereids_hint_tpch_p0/shape/q1.groovy b/regression-test/suites/nereids_hint_tpch_p0/shape/q1.groovy deleted file mode 100644 index a19547f7c3..0000000000 --- a/regression-test/suites/nereids_hint_tpch_p0/shape/q1.groovy +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -suite("q1") { - String db = context.config.getDbNameByFile(new File(context.file.parent)) - sql "use ${db}" - sql 'set enable_nereids_planner=true' - sql 'set enable_fallback_to_original_planner=false' - sql 'set exec_mem_limit=21G' - sql 'SET enable_pipeline_engine = true' - sql 'set parallel_pipeline_task_num=8' - -sql 'set be_number_for_test=3' -sql "set enable_runtime_filter_prune=false" - - - qt_select """ - explain shape plan - select - l_returnflag, - l_linestatus, - sum(l_quantity) as sum_qty, - sum(l_extendedprice) as sum_base_price, - sum(l_extendedprice * (1 - l_discount)) as sum_disc_price, - sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge, - avg(l_quantity) as avg_qty, - avg(l_extendedprice) as avg_price, - avg(l_discount) as avg_disc, - count(*) as count_order - from - lineitem - where - l_shipdate <= date '1998-12-01' - interval '90' day - group by - l_returnflag, - l_linestatus - order by - l_returnflag, - l_linestatus; - """ -} diff --git a/regression-test/suites/nereids_hint_tpch_p0/shape/q10.groovy b/regression-test/suites/nereids_hint_tpch_p0/shape/q10.groovy deleted file mode 100644 index 821b266bdf..0000000000 --- a/regression-test/suites/nereids_hint_tpch_p0/shape/q10.groovy +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -suite("q10") { - String db = context.config.getDbNameByFile(new File(context.file.parent)) - sql "use ${db}" - sql 'set enable_nereids_planner=true' - sql 'set enable_fallback_to_original_planner=false' - sql "set runtime_filter_mode='GLOBAL'" - sql 'set parallel_pipeline_task_num=8' - sql 'set exec_mem_limit=21G' - sql 'SET enable_pipeline_engine = true' - - - - -sql 'set be_number_for_test=3' -sql "set enable_runtime_filter_prune=false" - - qt_select """ - explain shape plan - select - /*+ leading(lineitem {{customer orders} nation}) */ - c_custkey, - c_name, - sum(l_extendedprice * (1 - l_discount)) as revenue, - c_acctbal, - n_name, - c_address, - c_phone, - c_comment - from - customer, - orders, - lineitem, - nation - where - c_custkey = o_custkey - and l_orderkey = o_orderkey - and o_orderdate >= date '1993-10-01' - and o_orderdate < date '1993-10-01' + interval '3' month - and l_returnflag = 'R' - and c_nationkey = n_nationkey - group by - c_custkey, - c_name, - c_acctbal, - c_phone, - n_name, - c_address, - c_comment - order by - revenue desc - limit 20; - """ -} diff --git a/regression-test/suites/nereids_hint_tpch_p0/shape/q12.groovy b/regression-test/suites/nereids_hint_tpch_p0/shape/q12.groovy deleted file mode 100644 index 9c6645e8a1..0000000000 --- a/regression-test/suites/nereids_hint_tpch_p0/shape/q12.groovy +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -suite("q12") { - String db = context.config.getDbNameByFile(new File(context.file.parent)) - sql "use ${db}" - sql 'set enable_nereids_planner=true' - sql 'set enable_fallback_to_original_planner=false' - sql "set runtime_filter_mode='GLOBAL'" - sql 'set parallel_pipeline_task_num=8' - sql 'set exec_mem_limit=21G' - sql 'SET enable_pipeline_engine = true' - - - - -sql 'set be_number_for_test=3' -sql "set enable_runtime_filter_prune=false" - - qt_select """ - explain shape plan - select - /*+ leading(orders lineitem) */ - l_shipmode, - sum(case - when o_orderpriority = '1-URGENT' - or o_orderpriority = '2-HIGH' - then 1 - else 0 - end) as high_line_count, - sum(case - when o_orderpriority <> '1-URGENT' - and o_orderpriority <> '2-HIGH' - then 1 - else 0 - end) as low_line_count - from - orders, - lineitem - where - o_orderkey = l_orderkey - and l_shipmode in ('MAIL', 'SHIP') - and l_commitdate < l_receiptdate - and l_shipdate < l_commitdate - and l_receiptdate >= date '1994-01-01' - and l_receiptdate < date '1994-01-01' + interval '1' year - group by - l_shipmode - order by - l_shipmode; - """ -} diff --git a/regression-test/suites/nereids_hint_tpch_p0/shape/q13.groovy b/regression-test/suites/nereids_hint_tpch_p0/shape/q13.groovy deleted file mode 100644 index aabab78ef4..0000000000 --- a/regression-test/suites/nereids_hint_tpch_p0/shape/q13.groovy +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -suite("q13") { - String db = context.config.getDbNameByFile(new File(context.file.parent)) - sql "use ${db}" - sql 'set enable_nereids_planner=true' - sql 'set enable_fallback_to_original_planner=false' - sql "set runtime_filter_mode='GLOBAL'" - sql 'set parallel_pipeline_task_num=8' - sql 'set exec_mem_limit=21G' - sql 'SET enable_pipeline_engine = true' - -sql 'set be_number_for_test=3' -sql "set enable_runtime_filter_prune=false" - - qt_select """ - explain shape plan - select - /*+ leading(orders customer) */ - c_count, - count(*) as custdist - from - ( - select - c_custkey, - count(o_orderkey) as c_count - from - customer left outer join orders on - c_custkey = o_custkey - and o_comment not like '%special%requests%' - group by - c_custkey - ) as c_orders - group by - c_count - order by - custdist desc, - c_count desc; - """ -} diff --git a/regression-test/suites/nereids_hint_tpch_p0/shape/q14.groovy b/regression-test/suites/nereids_hint_tpch_p0/shape/q14.groovy deleted file mode 100644 index 302a21e0c9..0000000000 --- a/regression-test/suites/nereids_hint_tpch_p0/shape/q14.groovy +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -suite("q14") { - String db = context.config.getDbNameByFile(new File(context.file.parent)) - sql "use ${db}" - sql 'set enable_nereids_planner=true' - sql 'set enable_fallback_to_original_planner=false' - sql "set runtime_filter_mode='GLOBAL'" - sql 'set parallel_pipeline_task_num=8' - sql 'set exec_mem_limit=21G' - sql 'SET enable_pipeline_engine = true' - -sql 'set be_number_for_test=3' -sql "set enable_runtime_filter_prune=false" - - qt_select """ - explain shape plan - select - /*+ leading(part lineitem) */ - 100.00 * sum(case - when p_type like 'PROMO%' - then l_extendedprice * (1 - l_discount) - else 0 - end) / sum(l_extendedprice * (1 - l_discount)) as promo_revenue - from - lineitem, - part - where - l_partkey = p_partkey - and l_shipdate >= date '1995-09-01' - and l_shipdate < date '1995-09-01' + interval '1' month; - """ -} diff --git a/regression-test/suites/nereids_hint_tpch_p0/shape/q16.groovy b/regression-test/suites/nereids_hint_tpch_p0/shape/q16.groovy deleted file mode 100644 index 569006143e..0000000000 --- a/regression-test/suites/nereids_hint_tpch_p0/shape/q16.groovy +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -suite("q16") { - String db = context.config.getDbNameByFile(new File(context.file.parent)) - sql "use ${db}" - sql 'set enable_nereids_planner=true' - sql 'set enable_fallback_to_original_planner=false' - sql "set runtime_filter_mode='GLOBAL'" - sql 'set parallel_pipeline_task_num=8' - sql 'set exec_mem_limit=21G' - sql 'SET enable_pipeline_engine = true' - - - - -sql 'set be_number_for_test=3' -sql "set enable_runtime_filter_prune=false" - - qt_select """ - explain shape plan - select - /*+ leading(partsupp part supplier) */ - p_brand, - p_type, - p_size, - count(distinct ps_suppkey) as supplier_cnt - from - partsupp, - part - where - p_partkey = ps_partkey - and p_brand <> 'Brand#45' - and p_type not like 'MEDIUM POLISHED%' - and p_size in (49, 14, 23, 45, 19, 3, 36, 9) - and ps_suppkey not in ( - select - s_suppkey - from - supplier - where - s_comment like '%Customer%Complaints%' - ) - group by - p_brand, - p_type, - p_size - order by - supplier_cnt desc, - p_brand, - p_type, - p_size; - """ -} diff --git a/regression-test/suites/nereids_hint_tpch_p0/shape/q19.groovy b/regression-test/suites/nereids_hint_tpch_p0/shape/q19.groovy deleted file mode 100644 index eb131a07e6..0000000000 --- a/regression-test/suites/nereids_hint_tpch_p0/shape/q19.groovy +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -suite("q19") { - String db = context.config.getDbNameByFile(new File(context.file.parent)) - - sql "use ${db}" - sql 'set enable_nereids_planner=true' - sql 'set enable_fallback_to_original_planner=false' - sql "set runtime_filter_mode='GLOBAL'" - sql 'set parallel_pipeline_task_num=8' - sql 'set exec_mem_limit=21G' - sql 'SET enable_pipeline_engine = true' - - - - -sql 'set be_number_for_test=3' -sql "set enable_runtime_filter_prune=false" - - qt_select """ - explain shape plan - select - /*+ leading(lineitem part) */ - sum(l_extendedprice* (1 - l_discount)) as revenue - from - lineitem, - part - where - ( - p_partkey = l_partkey - and p_brand = 'Brand#12' - and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG') - and l_quantity >= 1 and l_quantity <= 1 + 10 - and p_size between 1 and 5 - and l_shipmode in ('AIR', 'AIR REG') - and l_shipinstruct = 'DELIVER IN PERSON' - ) - or - ( - p_partkey = l_partkey - and p_brand = 'Brand#23' - and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK') - and l_quantity >= 10 and l_quantity <= 10 + 10 - and p_size between 1 and 10 - and l_shipmode in ('AIR', 'AIR REG') - and l_shipinstruct = 'DELIVER IN PERSON' - ) - or - ( - p_partkey = l_partkey - and p_brand = 'Brand#34' - and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG') - and l_quantity >= 20 and l_quantity <= 20 + 10 - and p_size between 1 and 15 - and l_shipmode in ('AIR', 'AIR REG') - and l_shipinstruct = 'DELIVER IN PERSON' - ); - - """ -} diff --git a/regression-test/suites/nereids_hint_tpch_p0/shape/q3.groovy b/regression-test/suites/nereids_hint_tpch_p0/shape/q3.groovy deleted file mode 100644 index 577fcbb571..0000000000 --- a/regression-test/suites/nereids_hint_tpch_p0/shape/q3.groovy +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -suite("q3") { - String db = context.config.getDbNameByFile(new File(context.file.parent)) - // db = "tpch" - sql "use ${db}" - sql 'set enable_nereids_planner=true' - sql 'set enable_fallback_to_original_planner=false' - sql "set runtime_filter_mode='GLOBAL'" - - sql 'set exec_mem_limit=21G' - sql 'SET enable_pipeline_engine = true' - sql 'set parallel_pipeline_task_num=8' - - - - - -sql 'set be_number_for_test=3' -sql "set enable_runtime_filter_prune=false" - - - qt_select """ - explain shape plan - select - /*+ leading(lineitem {orders customer}) */ - l_orderkey, - sum(l_extendedprice * (1 - l_discount)) as revenue, - o_orderdate, - o_shippriority - from - customer, - orders, - lineitem - where - c_mktsegment = 'BUILDING' - and c_custkey = o_custkey - and l_orderkey = o_orderkey - and o_orderdate < date '1995-03-15' - and l_shipdate > date '1995-03-15' - group by - l_orderkey, - o_orderdate, - o_shippriority - order by - revenue desc, - o_orderdate - limit 10; - """ -} diff --git a/regression-test/suites/nereids_hint_tpch_p0/shape/q4.groovy b/regression-test/suites/nereids_hint_tpch_p0/shape/q4.groovy deleted file mode 100644 index cf7ab67d1e..0000000000 --- a/regression-test/suites/nereids_hint_tpch_p0/shape/q4.groovy +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -suite("q4") { - String db = context.config.getDbNameByFile(new File(context.file.parent)) - sql "use ${db}" - sql 'set enable_nereids_planner=true' - sql 'set enable_fallback_to_original_planner=false' - sql "set runtime_filter_mode='GLOBAL'" - - sql 'set exec_mem_limit=21G' - sql 'SET enable_pipeline_engine = true' - sql 'set parallel_pipeline_task_num=8' - - - - -sql 'set be_number_for_test=3' -sql "set enable_runtime_filter_prune=false" - - - qt_select """ - explain shape plan - select - /*+ leading(lineitem orders) */ - o_orderpriority, - count(*) as order_count - from - orders - where - o_orderdate >= date '1993-07-01' - and o_orderdate < date '1993-07-01' + interval '3' month - and exists ( - select - * - from - lineitem - where - l_orderkey = o_orderkey - and l_commitdate < l_receiptdate - ) - group by - o_orderpriority - order by - o_orderpriority; - """ -} diff --git a/regression-test/suites/nereids_hint_tpch_p0/shape/q5.groovy b/regression-test/suites/nereids_hint_tpch_p0/shape/q5.groovy deleted file mode 100644 index c7f0146e25..0000000000 --- a/regression-test/suites/nereids_hint_tpch_p0/shape/q5.groovy +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -suite("q5") { - String db = context.config.getDbNameByFile(new File(context.file.parent)) - sql "use ${db}" - sql 'set enable_nereids_planner=true' - sql 'set enable_fallback_to_original_planner=false' - sql "set runtime_filter_mode='GLOBAL'" - - sql 'set exec_mem_limit=21G' - sql 'SET enable_pipeline_engine = true' - sql 'set parallel_pipeline_task_num=8' -sql 'set be_number_for_test=3' -sql "set enable_runtime_filter_prune=false" - -sql "set ignore_shape_nodes='PhysicalDistribute,PhysicalProject'" - - qt_select """ - explain shape plan - select - /*+ leading(lineitem {supplier {nation region}} orders customer) */ - n_name, - sum(l_extendedprice * (1 - l_discount)) as revenue - from - customer, - orders, - lineitem, - supplier, - nation, - region - where - c_custkey = o_custkey - and l_orderkey = o_orderkey - and l_suppkey = s_suppkey - and c_nationkey = s_nationkey - and s_nationkey = n_nationkey - and n_regionkey = r_regionkey - and r_name = 'ASIA' - and o_orderdate >= date '1994-01-01' - and o_orderdate < date '1994-01-01' + interval '1' year - group by - n_name - order by - revenue desc; - """ -} diff --git a/regression-test/suites/nereids_hint_tpch_p0/shape/q6.groovy b/regression-test/suites/nereids_hint_tpch_p0/shape/q6.groovy deleted file mode 100644 index 47449a0b80..0000000000 --- a/regression-test/suites/nereids_hint_tpch_p0/shape/q6.groovy +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -suite("q6") { - String db = context.config.getDbNameByFile(new File(context.file.parent)) - sql "use ${db}" - sql 'set enable_nereids_planner=true' - sql 'set enable_fallback_to_original_planner=false' - sql "set runtime_filter_mode='GLOBAL'" - - sql 'set global exec_mem_limit = 21G' - sql 'SET enable_pipeline_engine = true' - sql 'set parallel_pipeline_task_num=8' -sql 'set be_number_for_test=3' -sql "set enable_runtime_filter_prune=false" - - qt_select """ - explain shape plan - select - sum(l_extendedprice * l_discount) as revenue - from - lineitem - where - l_shipdate >= date '1994-01-01' - and l_shipdate < date '1994-01-01' + interval '1' year - and l_discount between .06 - 0.01 and .06 + 0.01 - and l_quantity < 24; - """ -} diff --git a/regression-test/suites/nereids_hint_tpch_p0/shape/q9.groovy b/regression-test/suites/nereids_hint_tpch_p0/shape/q9.groovy deleted file mode 100644 index 341674c434..0000000000 --- a/regression-test/suites/nereids_hint_tpch_p0/shape/q9.groovy +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -suite("q9") { - String db = context.config.getDbNameByFile(new File(context.file.parent)) - sql "use ${db}" - sql 'set enable_nereids_planner=true' - sql 'set enable_fallback_to_original_planner=false' - sql "set runtime_filter_mode='GLOBAL'" - sql 'set parallel_pipeline_task_num=8' - sql 'set exec_mem_limit=21G' - sql 'SET enable_pipeline_engine = true' - -sql 'set be_number_for_test=3' -sql "set enable_runtime_filter_prune=false" - - qt_select """ - explain shape plan - select - /*+ leading(orders {{lineitem part} {supplier nation}} partsupp) */ - nation, - o_year, - sum(amount) as sum_profit - from - ( - select - n_name as nation, - extract(year from o_orderdate) as o_year, - l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount - from - part, - supplier, - lineitem, - partsupp, - orders, - nation - where - s_suppkey = l_suppkey - and ps_suppkey = l_suppkey - and ps_partkey = l_partkey - and p_partkey = l_partkey - and o_orderkey = l_orderkey - and s_nationkey = n_nationkey - and p_name like '%green%' - ) as profit - group by - nation, - o_year - order by - nation, - o_year desc; - """ -} diff --git a/regression-test/suites/nereids_p0/hint/test_leading.groovy b/regression-test/suites/nereids_p0/hint/test_leading.groovy index 2464c2dd8f..7c24b4bec2 100644 --- a/regression-test/suites/nereids_p0/hint/test_leading.groovy +++ b/regression-test/suites/nereids_p0/hint/test_leading.groovy @@ -38,80 +38,895 @@ suite("test_leading") { sql """create table t3 (c3 int, c33 int) distributed by hash(c3) buckets 3 properties('replication_num' = '1');""" sql """create table t4 (c4 int, c44 int) distributed by hash(c4) buckets 3 properties('replication_num' = '1');""" - sql ''' - alter table t1 modify column c1 set stats ('ndv'='1', 'avg_size'='1', 'max_size'='1', 'num_nulls'='0', 'min_value'='1', 'max_value'='1', 'row_count'='10000') - ''' - sql ''' - alter table t2 modify column c2 set stats ('ndv'='1', 'avg_size'='1', 'max_size'='1', 'num_nulls'='0', 'min_value'='1', 'max_value'='1', 'row_count'='10000') - ''' - sql ''' - alter table t3 modify column c3 set stats ('ndv'='1', 'avg_size'='1', 'max_size'='1', 'num_nulls'='0', 'min_value'='1', 'max_value'='1', 'row_count'='10000') - ''' - sql ''' - alter table t4 modify column c4 set stats ('ndv'='1', 'avg_size'='1', 'max_size'='1', 'num_nulls'='0', 'min_value'='1', 'max_value'='1', 'row_count'='10000') - ''' + streamLoad { + table "t1" + db "test_leading" + set 'column_separator', '|' + set 'format', 'csv' + file 't1.csv' + time 10000 + } + + streamLoad { + table "t2" + db "test_leading" + set 'column_separator', '|' + set 'format', 'csv' + file 't2.csv' + time 10000 + } + + streamLoad { + table "t3" + db "test_leading" + set 'column_separator', '|' + set 'format', 'csv' + file 't3.csv' + time 10000 + } + + streamLoad { + table "t4" + db "test_leading" + set 'column_separator', '|' + set 'format', 'csv' + file 't4.csv' + time 10000 + } + +//// check table count + qt_select1_1 """select count(*) from t1;""" + qt_select1_2 """select count(*) from t2;""" + qt_select1_3 """select count(*) from t3;""" + qt_select1_4 """select count(*) from t4;""" + //// test inner join with all edge and vertax is complete and equal predicates - qt_select1 """explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = c2;""" - qt_select2 """explain shape plan select /*+ leading(t1 t2) */ * from t1 join t2 on c1 = c2;""" - qt_select3 """explain shape plan select /*+ leading(t1 t2 t3) */ * from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" - qt_select4 """explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" - qt_select5 """explain shape plan select /*+ leading(t1 {t2 t3} t4) */ * from t1 join t2 on c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4;""" - qt_select6 """explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select2_1 """select count(*) from t1 join t2 on c1 = c2;""" + qt_select2_2 """select /*+ leading(t2 t1) */ count(*) from t1 join t2 on c1 = c2;""" + qt_select2_3 """select /*+ leading(t1 t2) */ count(*) from t1 join t2 on c1 = c2;""" - // test inner join with part of edge and need cross join - qt_select7 """explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select3_1 """select count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" + qt_select3_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" + qt_select3_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" + qt_select3_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" + qt_select3_5 """select /*+ leading(t1 {t3 t2}) */ count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" + qt_select3_6 """select /*+ leading(t2 t3 t1) */ count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" + qt_select3_7 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" + qt_select3_8 """select /*+ leading(t2 t1 t3) */ count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" + qt_select3_9 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" + qt_select3_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" + qt_select3_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" + qt_select3_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" + qt_select3_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" -//// test outer join which can swap - // (A leftjoin B on (Pab)) innerjoin C on (Pac) = (A innerjoin C on (Pac)) leftjoin B on (Pab) - qt_select8 """explain shape plan select * from t1 left join t2 on c1 = c2 join t3 on c1 = c3;""" - qt_select9 """explain shape plan select /*+ leading(t1 t3 t2) */ * from t1 left join t2 on c1 = c2 join t3 on c1 = c3;""" - - // (A leftjoin B on (Pab)) leftjoin C on (Pac) = (A leftjoin C on (Pac)) leftjoin B on (Pab) - qt_select10 """explain shape plan select * from t1 left join t2 on c1 = c2 left join t3 on c1 = c3;""" - qt_select11 """explain shape plan select /*+ leading(t1 t3 t2) */ * from t1 left join t2 on c1 = c2 left join t3 on c1 = c3;""" + qt_select4_1 """select count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select4_2 """select /*+ leading(t1 {t2 t3} t4) */ count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select4_3 """select /*+ leading({t1 t2} {t3 t4}) */ count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select4_4 """select /*+ leading(t1 {t2 t3 t4}) */ count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select4_5 """select /*+ leading(t1 {t2 {t3 t4}}) */ count(*) from t1 join t2 on c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4;""" + + qt_select5_1 """select count(*) from t1 join t2 on c1 > c2;""" + qt_select5_2 """select /*+ leading(t2 t1) */ count(*) from t1 join t2 on c1 > c2;""" + + qt_select6_1 """select count(*) from t1 join t2 on c1 > c2 join t3 on c2 > c3 where c1 < 100;""" + qt_select6_2 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 join t2 on c1 > c2 join t3 on c2 > c3 where c1 < 100;""" + + // (A leftjoin B on (Pab)) leftjoin C on (Pac) = (A leftjoin C on (Pac)) leftjoin B on (Pab) + qt_select7_1 """select count(*) from t1 left join t2 on c1 = c2 left join t3 on c1 = c3;""" + qt_select7_2 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c1 = c3;""" + + qt_select8_1 """select count(*) from t1 left join t2 on c1 = c2 left join t3 on c1 = c3 where c1 between 100 and 300;""" + qt_select8_2 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c1 = c3 where c1 between 100 and 300;""" + + qt_select9_1 """select count(*) from t1 left join t2 on c1 = c2 left join t3 on c1 = c3 where c3 between 100 and 300;""" + qt_select9_2 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c1 = c3 where c3 between 100 and 300;""" + + qt_select10_1 """select count(*) from t1 left join t2 on c1 = c2 left join t3 on c1 = c3 where c2 between 100 and 300;""" + qt_select10_2 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c1 = c3 where c2 between 100 and 300;""" + + qt_select11_1 """select count(*) from t1 left join t2 on c1 = c2 left join t3 on c1 > c3 where c3 between 100 and 300;""" + qt_select11_2 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c1 > c3 where c3 between 100 and 300;""" // (A leftjoin B on (Pab)) leftjoin C on (Pbc) = A leftjoin (B leftjoin C on (Pbc)) on (Pab) - qt_select12 """explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3;""" - -//// test outer join which can not swap + qt_select12_1 """select count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select12_2 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3;""" + + qt_select13_1 """select count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c1 between 100 and 300;""" + qt_select13_2 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c1 between 100 and 300;""" + + qt_select14_1 """select count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c2 between 100 and 300;""" + qt_select14_2 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c2 between 100 and 300;""" + + qt_select15_1 """select count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c3 between 100 and 300;""" + qt_select15_2 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c3 between 100 and 300;""" + + //// test outer join which can not swap // A leftjoin (B join C on (Pbc)) on (Pab) != (A leftjoin B on (Pab)) join C on (Pbc) output should be unused when explain // this can be done because left join can be eliminated to inner join - qt_select13 """explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3;""" + qt_select16_1 """select count(*) from t1 left join t2 on c1 = c2 join t3 on c2 = c3;""" + qt_select16_2 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 join t3 on c2 = c3;""" - // this can not be done, expect not success but return right deep tree - qt_select14 """explain shape plan select * from t1 left join (select * from t2 join t3 on c2 = c3) as tmp on c1 = c2;""" - qt_select15 """explain shape plan select /*+ leading(t1 t2 t3) */ * from t1 left join (select * from t2 join t3 on c2 = c3) as tmp on c1 = c2;""" + // inner join + full outer join + qt_select17_1 """select count(*) from t1 join t2 on c1 = c2 full join t3 on c2 = c3;""" + qt_select17_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 join t2 on c1 = c2 full join t3 on c2 = c3;""" + qt_select17_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 join t2 on c1 = c2 full join t3 on c2 = c3;""" + qt_select17_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 join t2 on c1 = c2 full join t3 on c2 = c3;""" + qt_select17_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 join t2 on c1 = c2 full join t3 on c2 = c3;""" + qt_select17_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 join t2 on c1 = c2 full join t3 on c2 = c3;""" + qt_select17_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 join t2 on c1 = c2 full join t3 on c2 = c3;""" + qt_select17_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 join t2 on c1 = c2 full join t3 on c2 = c3;""" + qt_select17_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 join t2 on c1 = c2 full join t3 on c2 = c3;""" + qt_select17_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 join t2 on c1 = c2 full join t3 on c2 = c3;""" + qt_select17_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 join t2 on c1 = c2 full join t3 on c2 = c3;""" + qt_select17_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 join t2 on c1 = c2 full join t3 on c2 = c3;""" + qt_select17_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 join t2 on c1 = c2 full join t3 on c2 = c3;""" -//// test semi join - qt_select16 """explain shape plan select * from t1 where c1 in (select c2 from t2);""" - qt_select17 """explain shape plan select /*+ leading(t2 t1) */ * from t1 where c1 in (select c2 from t2);""" + // inner join + left outer join + qt_select18_1 """select count(*) from t1 join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select18_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select18_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select18_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select18_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select18_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select18_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select18_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select18_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select18_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select18_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select18_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select18_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 join t2 on c1 = c2 left join t3 on c2 = c3;""" -//// test anti join - qt_select18 """explain shape plan select * from t1 where exists (select 1 from t2);""" - qt_select19 """explain shape plan select /*+ leading (t2 t1) */ * from t1 where exists (select 1 from t2);""" + // inner join + right outer join + qt_select19_1 """select count(*) from t1 join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select19_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select19_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select19_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select19_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select19_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select19_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select19_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select19_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select19_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select19_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select19_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select19_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 join t2 on c1 = c2 right join t3 on c2 = c3;""" -//// test cte - // inline cte, change join order of tables inside cte - qt_select20 """explain shape plan with cte as (select * from t1 join t2 on c1 = c2) select * from cte, t2;""" - qt_select21 """explain shape plan with cte as (select * from t1 join t2 on c1 = c2) select /*+ leading(t2 t1 t3) */ * from cte, t3;""" - // outside cte - // inside and outside together (after unnest subquery) + // inner join + semi join + qt_select20_1 """select count(*) from t1 join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select20_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select20_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select20_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select20_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select20_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select20_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select20_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select20_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select20_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select20_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select20_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select20_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 join t2 on c1 = c2 left semi join t3 on c2 = c3;""" -//// test syntax error and unsupported feature - // not exist tables in leading: syntax error - qt_select22 """explain shape plan select /*+ leading(t66 t1) */ * from t1 join t2 on c1 = c2;""" - qt_select23 """explain shape plan select /*+ leading(t3 t1) */ * from t1 join t2 on c1 = c2;""" - // subquery alias as leading table - qt_select24 """explain shape plan with cte as (select * from t1 join t2 on c1 = c2) select /*+ leading(t2 cte t1) */ * from cte, t2;""" - // do not have all tables inside hint - qt_select25 """explain shape plan select /*+ leading(t1 t2) */ * from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" - // duplicated table - qt_select26 """explain shape plan select /*+ leading(t1 t1 t2 t3) */ * from t1 join t2 on c1 = c2 join t3 on c2 = c3;""" + // inner join + anti join + qt_select21_1 """select count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select21_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select21_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select21_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select21_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select21_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select21_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select21_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select21_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select21_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select21_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select21_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select21_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3;""" -//// test table alias - qt_select27 """explain shape plan select /*+ leading(t1 t_2) */ * from t1 join t2 t_2 on c1 = c2;""" - qt_select28 """explain shape plan select /*+ leading(t1 t2) */ * from t1 join t2 t_2 on c1 = c2;""" - qt_select29 """explain shape plan select /*+ leading(t1 t_1) */ * from t1 join t1 t_1 on t1.c1 = t_1.c1;""" + // left join + left join + qt_select22_1 """select count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select22_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select22_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select22_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select22_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select22_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select22_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select22_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select22_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select22_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select22_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select22_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3;""" + qt_select22_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3;""" + + // left join + right join + qt_select23_1 """select count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select23_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select23_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select23_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select23_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select23_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select23_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select23_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select23_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select23_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select23_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select23_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3;""" + qt_select23_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3;""" + + // left join + semi join + qt_select24_1 """select count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select24_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select24_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select24_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select24_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select24_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select24_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select24_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select24_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select24_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select24_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select24_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select24_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + + // left join + anti join + qt_select25_1 """select count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select25_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select25_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select25_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select25_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select25_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select25_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select25_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select25_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select25_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select25_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select25_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select25_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + + // right join + semi join + qt_select26_1 """select count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select26_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select26_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select26_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select26_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select26_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select26_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select26_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select26_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select26_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select26_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select26_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + qt_select26_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3;""" + + // right join + anti join + qt_select27_1 """select count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select27_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select27_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select27_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select27_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select27_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select27_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select27_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select27_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select27_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select27_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select27_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + qt_select27_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3;""" + + // semi join + anti join + qt_select28_1 """select count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3;""" + qt_select28_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3;""" + qt_select28_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3;""" + qt_select28_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3;""" + qt_select28_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3;""" + qt_select28_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3;""" + qt_select28_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3;""" + qt_select28_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3;""" + qt_select28_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3;""" + qt_select28_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3;""" + qt_select28_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3;""" + qt_select28_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3;""" + qt_select28_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3;""" + + // left join + left join + inner join + qt_select32_1 """select count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select32_2 """select /*+ leading(t1 t2 t3 t4) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select32_3 """select /*+ leading(t1 {t2 t3} t4) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select32_4 """select /*+ leading(t1 t3 t2 t4) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select32_5 """select /*+ leading(t1 {t2 t2} t4) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select32_6 """select /*+ leading(t2 t1 t3 t4) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select32_7 """select /*+ leading(t2 {t1 t3} t4) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select32_8 """select /*+ leading(t2 t3 t1 t4) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select32_9 """select /*+ leading(t2 {t3 t1} t4) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select32_10 """select /*+ leading(t3 t1 t2 t4) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select32_11 """select /*+ leading(t3 {t1 t2} t4) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select32_12 """select /*+ leading(t3 t2 t1 t4) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select32_13 """select /*+ leading(t3 {t2 t1} t4) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + +// left join + right join + inner join + qt_select33_1 """select count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select33_2 """select /*+ leading(t1 t2 t3 t4) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select33_3 """select /*+ leading(t1 {t2 t3} t4) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select33_4 """select /*+ leading(t1 t3 t2 t4) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select33_5 """select /*+ leading(t1 {t2 t2} t4) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select33_6 """select /*+ leading(t2 t1 t3 t4) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select33_7 """select /*+ leading(t2 {t1 t3} t4) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select33_8 """select /*+ leading(t2 t3 t1 t4) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select33_9 """select /*+ leading(t2 {t3 t1} t4) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select33_10 """select /*+ leading(t3 t1 t2 t4) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select33_11 """select /*+ leading(t3 {t1 t2} t4) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select33_12 """select /*+ leading(t3 t2 t1 t4) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select33_13 """select /*+ leading(t3 {t2 t1} t4) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + +// left join + semi join + inner join + qt_select34_1 """select count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select34_2 """select /*+ leading(t1 t2 t3 t4) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select34_3 """select /*+ leading(t1 {t2 t3} t4) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select34_4 """select /*+ leading(t1 t3 t2 t4) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select34_5 """select /*+ leading(t1 {t2 t2} t4) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select34_6 """select /*+ leading(t2 t1 t3 t4) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select34_7 """select /*+ leading(t2 {t1 t3} t4) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select34_8 """select /*+ leading(t2 t3 t1 t4) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select34_9 """select /*+ leading(t2 {t3 t1} t4) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select34_10 """select /*+ leading(t3 t1 t2 t4) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select34_11 """select /*+ leading(t3 {t1 t2} t4) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select34_12 """select /*+ leading(t3 t2 t1 t4) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select34_13 """select /*+ leading(t3 {t2 t1} t4) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + +// left join + anti join + inner join + qt_select35_1 """select count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select35_2 """select /*+ leading(t1 t2 t3 t4) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select35_3 """select /*+ leading(t1 {t2 t3} t4) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select35_4 """select /*+ leading(t1 t3 t2 t4) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select35_5 """select /*+ leading(t1 {t2 t2} t4) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select35_6 """select /*+ leading(t2 t1 t3 t4) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select35_7 """select /*+ leading(t2 {t1 t3} t4) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select35_8 """select /*+ leading(t2 t3 t1 t4) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select35_9 """select /*+ leading(t2 {t3 t1} t4) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select35_10 """select /*+ leading(t3 t1 t2 t4) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select35_11 """select /*+ leading(t3 {t1 t2} t4) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select35_12 """select /*+ leading(t3 t2 t1 t4) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select35_13 """select /*+ leading(t3 {t2 t1} t4) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + +// right join + semi join + inner join + qt_select36_1 """select count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select36_2 """select /*+ leading(t1 t2 t3 t4) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select36_3 """select /*+ leading(t1 {t2 t3} t4) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select36_4 """select /*+ leading(t1 t3 t2 t4) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select36_5 """select /*+ leading(t1 {t2 t2} t4) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select36_6 """select /*+ leading(t2 t1 t3 t4) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select36_7 """select /*+ leading(t2 {t1 t3} t4) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select36_8 """select /*+ leading(t2 t3 t1 t4) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select36_9 """select /*+ leading(t2 {t3 t1} t4) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select36_10 """select /*+ leading(t3 t1 t2 t4) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select36_11 """select /*+ leading(t3 {t1 t2} t4) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select36_12 """select /*+ leading(t3 t2 t1 t4) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select36_13 """select /*+ leading(t3 {t2 t1} t4) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + +// right join + anti join + inner join + qt_select37_1 """select count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select37_2 """select /*+ leading(t1 t2 t3 t4) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select37_3 """select /*+ leading(t1 {t2 t3} t4) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select37_4 """select /*+ leading(t1 t3 t2 t4) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select37_5 """select /*+ leading(t1 {t2 t2} t4) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select37_6 """select /*+ leading(t2 t1 t3 t4) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select37_7 """select /*+ leading(t2 {t1 t3} t4) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select37_8 """select /*+ leading(t2 t3 t1 t4) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select37_9 """select /*+ leading(t2 {t3 t1} t4) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select37_10 """select /*+ leading(t3 t1 t2 t4) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select37_11 """select /*+ leading(t3 {t1 t2} t4) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select37_12 """select /*+ leading(t3 t2 t1 t4) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select37_13 """select /*+ leading(t3 {t2 t1} t4) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + +// semi join + anti join + inner join + qt_select38_1 """select count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select38_2 """select /*+ leading(t1 t2 t3 t4) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select38_3 """select /*+ leading(t1 {t2 t3} t4) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select38_4 """select /*+ leading(t1 t3 t2 t4) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select38_5 """select /*+ leading(t1 {t2 t2} t4) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select38_6 """select /*+ leading(t2 t1 t3 t4) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select38_7 """select /*+ leading(t2 {t1 t3} t4) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select38_8 """select /*+ leading(t2 t3 t1 t4) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select38_9 """select /*+ leading(t2 {t3 t1} t4) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select38_10 """select /*+ leading(t3 t1 t2 t4) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select38_11 """select /*+ leading(t3 {t1 t2} t4) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select38_12 """select /*+ leading(t3 t2 t1 t4) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select38_13 """select /*+ leading(t3 {t2 t1} t4) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + + // left join + left join + inner join + qt_select42_1 """select count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select42_2 """select /*+ leading(t1 t2 t4 t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select42_3 """select /*+ leading(t1 {t2 t4} t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select42_4 """select /*+ leading(t1 t4 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select42_5 """select /*+ leading(t1 {t4 t2} t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select42_6 """select /*+ leading(t2 t1 t4 t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select42_7 """select /*+ leading(t2 {t1 t4} t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select42_8 """select /*+ leading(t2 t4 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select42_9 """select /*+ leading(t2 {t4 t1} t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select42_10 """select /*+ leading(t4 t1 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select42_11 """select /*+ leading(t4 {t1 t2} t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select42_12 """select /*+ leading(t4 t2 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select42_13 """select /*+ leading(t4 {t2 t1} t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 join t4 on c3 = c4;""" + +// left join + right join + inner join + qt_select43_1 """select count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select43_2 """select /*+ leading(t1 t2 t4 t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select43_3 """select /*+ leading(t1 {t2 t4} t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select43_4 """select /*+ leading(t1 t4 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select43_5 """select /*+ leading(t1 {t4 t2} t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select43_6 """select /*+ leading(t2 t1 t4 t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select43_7 """select /*+ leading(t2 {t1 t4} t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select43_8 """select /*+ leading(t2 t4 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select43_9 """select /*+ leading(t2 {t4 t1} t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select43_10 """select /*+ leading(t4 t1 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select43_11 """select /*+ leading(t4 {t1 t2} t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select43_12 """select /*+ leading(t4 t2 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + qt_select43_13 """select /*+ leading(t4 {t2 t1} t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 join t4 on c3 = c4;""" + +// left join + semi join + inner join + qt_select44_1 """select count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select44_2 """select /*+ leading(t1 t2 t4 t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select44_3 """select /*+ leading(t1 {t2 t4} t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select44_4 """select /*+ leading(t1 t4 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select44_5 """select /*+ leading(t1 {t4 t2} t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select44_6 """select /*+ leading(t2 t1 t4 t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select44_7 """select /*+ leading(t2 {t1 t4} t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select44_8 """select /*+ leading(t2 t4 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select44_9 """select /*+ leading(t2 {t4 t1} t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select44_10 """select /*+ leading(t4 t1 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select44_11 """select /*+ leading(t4 {t1 t2} t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select44_12 """select /*+ leading(t4 t2 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select44_13 """select /*+ leading(t4 {t2 t1} t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + +// left join + anti join + inner join + qt_select45_1 """select count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select45_2 """select /*+ leading(t1 t2 t4 t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select45_3 """select /*+ leading(t1 {t2 t4} t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select45_4 """select /*+ leading(t1 t4 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select45_5 """select /*+ leading(t1 {t4 t2} t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select45_6 """select /*+ leading(t2 t1 t4 t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select45_7 """select /*+ leading(t2 {t1 t4} t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select45_8 """select /*+ leading(t2 t4 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select45_9 """select /*+ leading(t2 {t4 t1} t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select45_10 """select /*+ leading(t4 t1 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select45_11 """select /*+ leading(t4 {t1 t2} t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select45_12 """select /*+ leading(t4 t2 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select45_13 """select /*+ leading(t4 {t2 t1} t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + +// right join + semi join + inner join + qt_select46_1 """select count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select46_2 """select /*+ leading(t1 t2 t4 t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select46_3 """select /*+ leading(t1 {t2 t4} t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select46_4 """select /*+ leading(t1 t4 t2 t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select46_5 """select /*+ leading(t1 {t4 t2} t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select46_6 """select /*+ leading(t2 t1 t4 t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select46_7 """select /*+ leading(t2 {t1 t4} t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select46_8 """select /*+ leading(t2 t4 t1 t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select46_9 """select /*+ leading(t2 {t4 t1} t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select46_10 """select /*+ leading(t4 t1 t2 t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select46_11 """select /*+ leading(t4 {t1 t2} t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select46_12 """select /*+ leading(t4 t2 t1 t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select46_13 """select /*+ leading(t4 {t2 t1} t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 join t4 on c1 = c4;""" + +// right join + anti join + inner join + qt_select47_1 """select count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select47_2 """select /*+ leading(t1 t2 t4 t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select47_3 """select /*+ leading(t1 {t2 t4} t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select47_4 """select /*+ leading(t1 t4 t2 t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select47_5 """select /*+ leading(t1 {t4 t2} t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select47_6 """select /*+ leading(t2 t1 t4 t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select47_7 """select /*+ leading(t2 {t1 t4} t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select47_8 """select /*+ leading(t2 t4 t1 t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select47_9 """select /*+ leading(t2 {t4 t1} t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select47_10 """select /*+ leading(t4 t1 t2 t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select47_11 """select /*+ leading(t4 {t1 t2} t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select47_12 """select /*+ leading(t4 t2 t1 t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + qt_select47_13 """select /*+ leading(t4 {t2 t1} t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 join t4 on c1 = c4;""" + +// semi join + anti join + inner join + qt_select48_1 """select count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select48_2 """select /*+ leading(t1 t2 t4 t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select48_3 """select /*+ leading(t1 {t2 t4} t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select48_4 """select /*+ leading(t1 t4 t2 t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select48_5 """select /*+ leading(t1 {t4 t2} t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select48_6 """select /*+ leading(t2 t1 t4 t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select48_7 """select /*+ leading(t2 {t1 t4} t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select48_8 """select /*+ leading(t2 t4 t1 t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select48_9 """select /*+ leading(t2 {t4 t1} t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select48_10 """select /*+ leading(t4 t1 t2 t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select48_11 """select /*+ leading(t4 {t1 t2} t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select48_12 """select /*+ leading(t4 t2 t1 t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + qt_select48_13 """select /*+ leading(t4 {t2 t1} t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 join t4 on c1 = c4;""" + + // left join + left join + inner join + qt_select49_1 """select count(*) from t1 left join t2 on c1 = c2 join t3 on c2 = c3 left join t4 on t3.c3 = t4.c4;""" + qt_select49_2 """select /*+ leading(t1 t2 {t3 t4}) */ count(*) from t1 left join t2 on c1 = c2 join t3 on c2 = c3 left join t4 on t3.c3 = t4.c4;""" + qt_select49_3 """select /*+ leading({t1 t2} t3 t4) */ count(*) from t1 left join t2 on c1 = c2 join t3 on c2 = c3 left join t4 on t3.c3 = t4.c4;""" + qt_select49_4 """select /*+ leading({t1 t3} t2 t4) */ count(*) from t1 left join t2 on c1 = c2 join t3 on c2 = c3 left join t4 on t3.c3 = t4.c4;""" + qt_select49_5 """select /*+ leading(t1 {t3 t4} t2) */ count(*) from t1 left join t2 on c1 = c2 join t3 on c2 = c3 left join t4 on t3.c3 = t4.c4;""" + qt_select49_6 """select /*+ leading({t1 t3} t4 t2) */ count(*) from t1 left join t2 on c1 = c2 join t3 on c2 = c3 left join t4 on t3.c3 = t4.c4;""" + + // cte + qt_select50_1 """with cte as (select * from t1 join t2 on c1 = c2) select count(*) from cte, t2;""" + qt_select50_2 """with cte as (select /*+ leading(t2 t1) */* from t1 join t2 on c1 = c2) select /*+ leading(cte t3) */ count(*) from cte, t3;""" + qt_select50_3 """with cte as (select /*+ leading(t2 t1) */* from t1 join t2 on c1 = c2) select count(*) from cte, t3;""" + qt_select50_4 """with cte as (select * from t1 join t2 on c1 = c2) select /*+ leading(cte t3) */ count(*) from cte, t3;""" + + // in subquery + +// inner join + anti join + qt_select51_1 """select count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select51_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select51_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select51_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select51_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select51_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select51_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select51_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select51_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select51_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select51_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select51_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select51_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + +// left join + left join + qt_select52_1 """select count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select52_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select52_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select52_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select52_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select52_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select52_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select52_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select52_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select52_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select52_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select52_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select52_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where c1 in (select c4 from t4);""" + +// left join + right join + qt_select53_1 """select count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select53_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select53_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select53_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select53_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select53_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select53_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select53_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select53_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select53_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select53_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select53_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select53_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where c1 in (select c4 from t4);""" + +// left join + semi join + qt_select54_1 """select count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select54_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select54_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select54_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select54_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select54_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select54_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select54_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select54_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select54_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select54_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select54_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select54_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + +// left join + anti join + qt_select55_1 """select count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select55_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select55_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select55_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select55_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select55_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select55_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select55_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select55_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select55_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select55_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select55_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select55_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + +// right join + semi join + qt_select56_1 """select count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select56_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select56_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select56_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select56_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select56_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select56_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select56_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select56_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select56_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select56_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select56_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select56_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where c1 in (select c4 from t4);""" + +// right join + anti join + qt_select57_1 """select count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select57_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select57_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select57_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select57_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select57_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select57_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select57_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select57_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select57_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select57_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select57_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + qt_select57_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where c1 in (select c4 from t4);""" + +// semi join + anti join + qt_select58_1 """select count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where c1 in (select c4 from t4);""" + qt_select58_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where c1 in (select c4 from t4);""" + qt_select58_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where c1 in (select c4 from t4);""" + qt_select58_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where c1 in (select c4 from t4);""" + qt_select58_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where c1 in (select c4 from t4);""" + qt_select58_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where c1 in (select c4 from t4);""" + qt_select58_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where c1 in (select c4 from t4);""" + qt_select58_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where c1 in (select c4 from t4);""" + qt_select58_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where c1 in (select c4 from t4);""" + qt_select58_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where c1 in (select c4 from t4);""" + qt_select58_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where c1 in (select c4 from t4);""" + qt_select58_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where c1 in (select c4 from t4);""" + qt_select58_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where c1 in (select c4 from t4);""" + + // exists subquery + +// inner join + anti join + qt_select61_1 """select count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select61_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select61_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select61_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select61_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select61_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select61_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select61_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select61_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select61_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select61_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select61_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select61_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + +// left join + left join + qt_select62_1 """select count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select62_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select62_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select62_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select62_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select62_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select62_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select62_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select62_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select62_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select62_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select62_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select62_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left join t2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + +// left join + right join + qt_select63_1 """select count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select63_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select63_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select63_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select63_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select63_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select63_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select63_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select63_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select63_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select63_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select63_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select63_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left join t2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + +// left join + semi join + qt_select64_1 """select count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select64_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select64_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select64_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select64_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select64_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select64_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select64_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select64_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select64_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select64_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select64_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select64_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + +// left join + anti join + qt_select65_1 """select count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select65_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select65_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select65_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select65_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select65_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select65_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select65_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select65_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select65_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select65_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select65_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select65_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + +// right join + semi join + qt_select66_1 """select count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select66_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select66_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select66_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select66_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select66_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select66_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select66_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select66_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select66_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select66_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select66_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select66_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 right join t2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + +// right join + anti join + qt_select67_1 """select count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select67_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select67_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select67_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select67_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select67_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select67_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select67_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select67_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select67_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select67_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select67_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select67_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 right join t2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + +// semi join + anti join + qt_select68_1 """select count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select68_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select68_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select68_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select68_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select68_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select68_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select68_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select68_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select68_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select68_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select68_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select68_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left semi join t2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + + // wrong table name + qt_select70_1 """explain shape plan select /*+ leading(t1 t3) */ count(*) from t1 join t2 on c1 = c2;""" + qt_select70_2 """explain shape plan select /*+ leading(t1 t5) */ count(*) from t1 join t2 on c1 = c2;""" + + // duplicate table name + qt_select71_1 """explain shape plan select /*+ leading(t1 t1 t2) */ count(*) from t1 join t2 on c1 = c2;""" + qt_select71_2 """explain shape plan select /*+ leading(t1 t2 t2) */ count(*) from t1 join t2 on c1 = c2;""" + + // different scope + qt_select72_1 """explain shape plan select count(*) from t1 join t2 on c1 = c2 where c2 in (select /*+ leading(t4 t3) */ c3 from t3 join t4 on c3 = c4);""" + qt_select72_2 """explain shape plan select /*+ leading(t1 t2) */ count(*) from t1 join t2 on c1 = c2 where c2 in (select c3 from t3 join t4 on c3 = c4);""" + + // multi leading hint + qt_select73_1 """explain shape plan select /*+ leading(t1 t2) */ count(*) from t1 join t2 on c1 = c2 where c2 in (select /*+ leading(t4 t3) */ c3 from t3 join t4 on c3 = c4);""" + + // alias +// inner join + anti join + qt_select81_1 """select count(*) from t1 join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select81_2 """select /*+ leading(t1 alias2 t3) */ count(*) from t1 join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select81_3 """select /*+ leading(t1 {alias2 t3}) */ count(*) from t1 join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select81_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select81_5 """select /*+ leading(t1 {alias2 t2}) */ count(*) from t1 join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select81_6 """select /*+ leading(alias2 t1 t3) */ count(*) from t1 join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select81_7 """select /*+ leading(alias2 {t1 t3}) */ count(*) from t1 join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select81_8 """select /*+ leading(alias2 t3 t1) */ count(*) from t1 join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select81_9 """select /*+ leading(alias2 {t3 t1}) */ count(*) from t1 join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select81_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select81_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select81_12 """select /*+ leading(t3 alias2 t1) */ count(*) from t1 join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select81_13 """select /*+ leading(t3 {alias2 t1}) */ count(*) from t1 join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + +// left join + left join + qt_select82_1 """select count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select82_2 """select /*+ leading(t1 alias2 t3) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select82_3 """select /*+ leading(t1 {alias2 t3}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select82_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select82_5 """select /*+ leading(t1 {alias2 t2}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select82_6 """select /*+ leading(alias2 t1 t3) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select82_7 """select /*+ leading(alias2 {t1 t3}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select82_8 """select /*+ leading(alias2 t3 t1) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select82_9 """select /*+ leading(alias2 {t3 t1}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select82_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select82_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select82_12 """select /*+ leading(t3 alias2 t1) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select82_13 """select /*+ leading(t3 {alias2 t1}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + +// left join + right join + qt_select83_1 """select count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select83_2 """select /*+ leading(t1 alias2 t3) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select83_3 """select /*+ leading(t1 {alias2 t3}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select83_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select83_5 """select /*+ leading(t1 {alias2 t2}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select83_6 """select /*+ leading(alias2 t1 t3) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select83_7 """select /*+ leading(alias2 {t1 t3}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select83_8 """select /*+ leading(alias2 t3 t1) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select83_9 """select /*+ leading(alias2 {t3 t1}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select83_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select83_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select83_12 """select /*+ leading(t3 alias2 t1) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select83_13 """select /*+ leading(t3 {alias2 t1}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 right join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + +// left join + semi join + qt_select84_1 """select count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select84_2 """select /*+ leading(t1 alias2 t3) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select84_3 """select /*+ leading(t1 {alias2 t3}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select84_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select84_5 """select /*+ leading(t1 {alias2 t2}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select84_6 """select /*+ leading(alias2 t1 t3) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select84_7 """select /*+ leading(alias2 {t1 t3}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select84_8 """select /*+ leading(alias2 t3 t1) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select84_9 """select /*+ leading(alias2 {t3 t1}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select84_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select84_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select84_12 """select /*+ leading(t3 alias2 t1) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select84_13 """select /*+ leading(t3 {alias2 t1}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + +// left join + anti join + qt_select85_1 """select count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select85_2 """select /*+ leading(t1 alias2 t3) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select85_3 """select /*+ leading(t1 {alias2 t3}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select85_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select85_5 """select /*+ leading(t1 {alias2 t2}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select85_6 """select /*+ leading(alias2 t1 t3) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select85_7 """select /*+ leading(alias2 {t1 t3}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select85_8 """select /*+ leading(alias2 t3 t1) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select85_9 """select /*+ leading(alias2 {t3 t1}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select85_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select85_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select85_12 """select /*+ leading(t3 alias2 t1) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select85_13 """select /*+ leading(t3 {alias2 t1}) */ count(*) from t1 left join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + +// right join + semi join + qt_select86_1 """select count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select86_2 """select /*+ leading(t1 alias2 t3) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select86_3 """select /*+ leading(t1 {alias2 t3}) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select86_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select86_5 """select /*+ leading(t1 {alias2 t2}) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select86_6 """select /*+ leading(alias2 t1 t3) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select86_7 """select /*+ leading(alias2 {t1 t3}) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select86_8 """select /*+ leading(alias2 t3 t1) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select86_9 """select /*+ leading(alias2 {t3 t1}) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select86_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select86_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select86_12 """select /*+ leading(t3 alias2 t1) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select86_13 """select /*+ leading(t3 {alias2 t1}) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left semi join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + +// right join + anti join + qt_select87_1 """select count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select87_2 """select /*+ leading(t1 alias2 t3) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select87_3 """select /*+ leading(t1 {alias2 t3}) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select87_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select87_5 """select /*+ leading(t1 {alias2 t2}) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select87_6 """select /*+ leading(alias2 t1 t3) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select87_7 """select /*+ leading(alias2 {t1 t3}) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select87_8 """select /*+ leading(alias2 t3 t1) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select87_9 """select /*+ leading(alias2 {t3 t1}) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select87_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select87_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select87_12 """select /*+ leading(t3 alias2 t1) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select87_13 """select /*+ leading(t3 {alias2 t1}) */ count(*) from t1 right join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c2 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + +// semi join + anti join + qt_select88_1 """select count(*) from t1 left semi join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select88_2 """select /*+ leading(t1 alias2 t3) */ count(*) from t1 left semi join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select88_3 """select /*+ leading(t1 {alias2 t3}) */ count(*) from t1 left semi join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select88_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left semi join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select88_5 """select /*+ leading(t1 {alias2 t2}) */ count(*) from t1 left semi join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select88_6 """select /*+ leading(alias2 t1 t3) */ count(*) from t1 left semi join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select88_7 """select /*+ leading(alias2 {t1 t3}) */ count(*) from t1 left semi join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select88_8 """select /*+ leading(alias2 t3 t1) */ count(*) from t1 left semi join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select88_9 """select /*+ leading(alias2 {t3 t1}) */ count(*) from t1 left semi join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select88_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left semi join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select88_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left semi join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select88_12 """select /*+ leading(t3 alias2 t1) */ count(*) from t1 left semi join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" + qt_select88_13 """select /*+ leading(t3 {alias2 t1}) */ count(*) from t1 left semi join (select c2 from t2) as alias2 on c1 = c2 left anti join t3 on c1 = c3 where exists (select 1 from t3 join t4 on c3 = c4);""" sql """drop table if exists t1;""" sql """drop table if exists t2;"""