Skip to content
This repository was archived by the owner on Jan 7, 2025. It is now read-only.

Commit e9188f9

Browse files
authored
feat: support tpch q7 and q9 (#72)
Support `BinOpType::Or`
1 parent 214848c commit e9188f9

File tree

5 files changed

+438
-1
lines changed

5 files changed

+438
-1
lines changed

optd-datafusion-bridge/src/from_optd.rs

+1
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ impl OptdPlanContext<'_> {
220220
BinOpType::Geq => Operator::GtEq,
221221
BinOpType::Gt => Operator::Gt,
222222
BinOpType::And => Operator::And,
223+
BinOpType::Or => Operator::Or,
223224
BinOpType::Add => Operator::Plus,
224225
BinOpType::Sub => Operator::Minus,
225226
BinOpType::Mul => Operator::Multiply,

optd-datafusion-bridge/src/into_optd.rs

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ impl OptdPlanContext<'_> {
5959
Operator::GtEq => BinOpType::Geq,
6060
Operator::Gt => BinOpType::Gt,
6161
Operator::And => BinOpType::And,
62+
Operator::Or => BinOpType::Or,
6263
Operator::Plus => BinOpType::Add,
6364
Operator::Minus => BinOpType::Sub,
6465
Operator::Multiply => BinOpType::Mul,

optd-datafusion-repr/src/properties/column_ref.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ impl PropertyBuilder<OptRelNodeTyp> for ColumnRefPropertyBuilder {
3838
data: Option<optd_core::rel_node::Value>,
3939
children: &[&Self::Prop],
4040
) -> Self::Prop {
41+
// println!(
42+
// "derive column_ref: {:?}, data: {:?}, children: {:?}",
43+
// typ, data, children
44+
// );
4145
match typ {
4246
// Should account for PhysicalScan.
4347
OptRelNodeTyp::Scan => {
@@ -103,7 +107,8 @@ impl PropertyBuilder<OptRelNodeTyp> for ColumnRefPropertyBuilder {
103107
| OptRelNodeTyp::Func(_)
104108
| OptRelNodeTyp::BinOp(_)
105109
| OptRelNodeTyp::Between
106-
| OptRelNodeTyp::EmptyRelation => {
110+
| OptRelNodeTyp::EmptyRelation
111+
| OptRelNodeTyp::Like => {
107112
vec![ColumnRef::Derived]
108113
}
109114
_ => unimplemented!("Unsupported rel node type {:?}", typ),

optd-sqlplannertest/tests/tpch.planner.sql

+351
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,196 @@ PhysicalProjection { exprs: [ #0 ] }
293293
└── PhysicalScan { table: lineitem }
294294
*/
295295

296+
-- TPC-H Q7
297+
SELECT
298+
supp_nation,
299+
cust_nation,
300+
l_year,
301+
SUM(volume) AS revenue
302+
FROM
303+
(
304+
SELECT
305+
n1.n_name AS supp_nation,
306+
n2.n_name AS cust_nation,
307+
EXTRACT(YEAR FROM l_shipdate) AS l_year,
308+
l_extendedprice * (1 - l_discount) AS volume
309+
FROM
310+
supplier,
311+
lineitem,
312+
orders,
313+
customer,
314+
nation n1,
315+
nation n2
316+
WHERE
317+
s_suppkey = l_suppkey
318+
AND o_orderkey = l_orderkey
319+
AND c_custkey = o_custkey
320+
AND s_nationkey = n1.n_nationkey
321+
AND c_nationkey = n2.n_nationkey
322+
AND (
323+
(n1.n_name = 'FRANCE' AND n2.n_name = 'GERMANY')
324+
OR (n1.n_name = 'GERMANY' AND n2.n_name = 'FRANCE')
325+
)
326+
AND l_shipdate BETWEEN DATE '1995-01-01' AND DATE '1996-12-31'
327+
) AS shipping
328+
GROUP BY
329+
supp_nation,
330+
cust_nation,
331+
l_year
332+
ORDER BY
333+
supp_nation,
334+
cust_nation,
335+
l_year;
336+
337+
/*
338+
LogicalSort
339+
├── exprs:
340+
│ ┌── SortOrder { order: Asc }
341+
│ │ └── #0
342+
│ ├── SortOrder { order: Asc }
343+
│ │ └── #1
344+
│ └── SortOrder { order: Asc }
345+
│ └── #2
346+
└── LogicalProjection { exprs: [ #0, #1, #2, #3 ] }
347+
└── LogicalAgg
348+
├── exprs:Agg(Sum)
349+
│ └── [ #3 ]
350+
├── groups: [ #0, #1, #2 ]
351+
└── LogicalProjection
352+
├── exprs:
353+
│ ┌── #41
354+
│ ├── #45
355+
│ ├── Scalar(DatePart)
356+
│ │ └── [ "YEAR", #17 ]
357+
│ └── Mul
358+
│ ├── #12
359+
│ └── Sub
360+
│ ├── Cast { cast_to: Decimal128(0), expr: 1 }
361+
│ └── #13
362+
└── LogicalFilter
363+
├── cond:And
364+
│ ├── And
365+
│ │ ├── And
366+
│ │ │ ├── And
367+
│ │ │ │ ├── And
368+
│ │ │ │ │ ├── And
369+
│ │ │ │ │ │ ├── Eq
370+
│ │ │ │ │ │ │ ├── #0
371+
│ │ │ │ │ │ │ └── #9
372+
│ │ │ │ │ │ └── Eq
373+
│ │ │ │ │ │ ├── #23
374+
│ │ │ │ │ │ └── #7
375+
│ │ │ │ │ └── Eq
376+
│ │ │ │ │ ├── #32
377+
│ │ │ │ │ └── #24
378+
│ │ │ │ └── Eq
379+
│ │ │ │ ├── #3
380+
│ │ │ │ └── #40
381+
│ │ │ └── Eq
382+
│ │ │ ├── #35
383+
│ │ │ └── #44
384+
│ │ └── Or
385+
│ │ ├── And
386+
│ │ │ ├── Eq
387+
│ │ │ │ ├── #41
388+
│ │ │ │ └── "FRANCE"
389+
│ │ │ └── Eq
390+
│ │ │ ├── #45
391+
│ │ │ └── "GERMANY"
392+
│ │ └── And
393+
│ │ ├── Eq
394+
│ │ │ ├── #41
395+
│ │ │ └── "GERMANY"
396+
│ │ └── Eq
397+
│ │ ├── #45
398+
│ │ └── "FRANCE"
399+
│ └── Between { expr: #17, lower: Cast { cast_to: Date32(0), expr: "1995-01-01" }, upper: Cast { cast_to: Date32(0), expr: "1996-12-31" } }
400+
└── LogicalJoin { join_type: Cross, cond: true }
401+
├── LogicalJoin { join_type: Cross, cond: true }
402+
│ ├── LogicalJoin { join_type: Cross, cond: true }
403+
│ │ ├── LogicalJoin { join_type: Cross, cond: true }
404+
│ │ │ ├── LogicalJoin { join_type: Cross, cond: true }
405+
│ │ │ │ ├── LogicalScan { table: supplier }
406+
│ │ │ │ └── LogicalScan { table: lineitem }
407+
│ │ │ └── LogicalScan { table: orders }
408+
│ │ └── LogicalScan { table: customer }
409+
│ └── LogicalScan { table: nation }
410+
└── LogicalScan { table: nation }
411+
PhysicalSort
412+
├── exprs:
413+
│ ┌── SortOrder { order: Asc }
414+
│ │ └── #0
415+
│ ├── SortOrder { order: Asc }
416+
│ │ └── #1
417+
│ └── SortOrder { order: Asc }
418+
│ └── #2
419+
└── PhysicalProjection { exprs: [ #0, #1, #2, #3 ] }
420+
└── PhysicalAgg
421+
├── aggrs:Agg(Sum)
422+
│ └── [ #3 ]
423+
├── groups: [ #0, #1, #2 ]
424+
└── PhysicalProjection
425+
├── exprs:
426+
│ ┌── #41
427+
│ ├── #45
428+
│ ├── Scalar(DatePart)
429+
│ │ └── [ "YEAR", #17 ]
430+
│ └── Mul
431+
│ ├── #12
432+
│ └── Sub
433+
│ ├── Cast { cast_to: Decimal128(0), expr: 1 }
434+
│ └── #13
435+
└── PhysicalFilter
436+
├── cond:And
437+
│ ├── And
438+
│ │ ├── And
439+
│ │ │ ├── And
440+
│ │ │ │ ├── And
441+
│ │ │ │ │ ├── And
442+
│ │ │ │ │ │ ├── Eq
443+
│ │ │ │ │ │ │ ├── #0
444+
│ │ │ │ │ │ │ └── #9
445+
│ │ │ │ │ │ └── Eq
446+
│ │ │ │ │ │ ├── #23
447+
│ │ │ │ │ │ └── #7
448+
│ │ │ │ │ └── Eq
449+
│ │ │ │ │ ├── #32
450+
│ │ │ │ │ └── #24
451+
│ │ │ │ └── Eq
452+
│ │ │ │ ├── #3
453+
│ │ │ │ └── #40
454+
│ │ │ └── Eq
455+
│ │ │ ├── #35
456+
│ │ │ └── #44
457+
│ │ └── Or
458+
│ │ ├── And
459+
│ │ │ ├── Eq
460+
│ │ │ │ ├── #41
461+
│ │ │ │ └── "FRANCE"
462+
│ │ │ └── Eq
463+
│ │ │ ├── #45
464+
│ │ │ └── "GERMANY"
465+
│ │ └── And
466+
│ │ ├── Eq
467+
│ │ │ ├── #41
468+
│ │ │ └── "GERMANY"
469+
│ │ └── Eq
470+
│ │ ├── #45
471+
│ │ └── "FRANCE"
472+
│ └── Between { expr: #17, lower: Cast { cast_to: Date32(0), expr: "1995-01-01" }, upper: Cast { cast_to: Date32(0), expr: "1996-12-31" } }
473+
└── PhysicalNestedLoopJoin { join_type: Cross, cond: true }
474+
├── PhysicalNestedLoopJoin { join_type: Cross, cond: true }
475+
│ ├── PhysicalNestedLoopJoin { join_type: Cross, cond: true }
476+
│ │ ├── PhysicalNestedLoopJoin { join_type: Cross, cond: true }
477+
│ │ │ ├── PhysicalNestedLoopJoin { join_type: Cross, cond: true }
478+
│ │ │ │ ├── PhysicalScan { table: supplier }
479+
│ │ │ │ └── PhysicalScan { table: lineitem }
480+
│ │ │ └── PhysicalScan { table: orders }
481+
│ │ └── PhysicalScan { table: customer }
482+
│ └── PhysicalScan { table: nation }
483+
└── PhysicalScan { table: nation }
484+
*/
485+
296486
-- TPC-H Q8 without top-most limit node
297487
select
298488
o_year,
@@ -505,3 +695,164 @@ PhysicalSort
505695
└── PhysicalScan { table: region }
506696
*/
507697

698+
-- TPC-H Q9
699+
SELECT
700+
nation,
701+
o_year,
702+
SUM(amount) AS sum_profit
703+
FROM
704+
(
705+
SELECT
706+
n_name AS nation,
707+
EXTRACT(YEAR FROM o_orderdate) AS o_year,
708+
l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity AS amount
709+
FROM
710+
part,
711+
supplier,
712+
lineitem,
713+
partsupp,
714+
orders,
715+
nation
716+
WHERE
717+
s_suppkey = l_suppkey
718+
AND ps_suppkey = l_suppkey
719+
AND ps_partkey = l_partkey
720+
AND p_partkey = l_partkey
721+
AND o_orderkey = l_orderkey
722+
AND s_nationkey = n_nationkey
723+
AND p_name LIKE '%green%'
724+
) AS profit
725+
GROUP BY
726+
nation,
727+
o_year
728+
ORDER BY
729+
nation,
730+
o_year DESC;
731+
732+
/*
733+
LogicalSort
734+
├── exprs:
735+
│ ┌── SortOrder { order: Asc }
736+
│ │ └── #0
737+
│ └── SortOrder { order: Desc }
738+
│ └── #1
739+
└── LogicalProjection { exprs: [ #0, #1, #2 ] }
740+
└── LogicalAgg
741+
├── exprs:Agg(Sum)
742+
│ └── [ #2 ]
743+
├── groups: [ #0, #1 ]
744+
└── LogicalProjection
745+
├── exprs:
746+
│ ┌── #47
747+
│ ├── Scalar(DatePart)
748+
│ │ └── [ "YEAR", #41 ]
749+
│ └── Sub
750+
│ ├── Mul
751+
│ │ ├── #21
752+
│ │ └── Sub
753+
│ │ ├── Cast { cast_to: Decimal128(0), expr: 1 }
754+
│ │ └── #22
755+
│ └── Mul
756+
│ ├── #35
757+
│ └── #20
758+
└── LogicalFilter
759+
├── cond:And
760+
│ ├── And
761+
│ │ ├── And
762+
│ │ │ ├── And
763+
│ │ │ │ ├── And
764+
│ │ │ │ │ ├── And
765+
│ │ │ │ │ │ ├── Eq
766+
│ │ │ │ │ │ │ ├── #9
767+
│ │ │ │ │ │ │ └── #18
768+
│ │ │ │ │ │ └── Eq
769+
│ │ │ │ │ │ ├── #33
770+
│ │ │ │ │ │ └── #18
771+
│ │ │ │ │ └── Eq
772+
│ │ │ │ │ ├── #32
773+
│ │ │ │ │ └── #17
774+
│ │ │ │ └── Eq
775+
│ │ │ │ ├── #0
776+
│ │ │ │ └── #17
777+
│ │ │ └── Eq
778+
│ │ │ ├── #37
779+
│ │ │ └── #16
780+
│ │ └── Eq
781+
│ │ ├── #12
782+
│ │ └── #46
783+
│ └── Like { expr: #1, pattern: "%green%" }
784+
└── LogicalJoin { join_type: Cross, cond: true }
785+
├── LogicalJoin { join_type: Cross, cond: true }
786+
│ ├── LogicalJoin { join_type: Cross, cond: true }
787+
│ │ ├── LogicalJoin { join_type: Cross, cond: true }
788+
│ │ │ ├── LogicalJoin { join_type: Cross, cond: true }
789+
│ │ │ │ ├── LogicalScan { table: part }
790+
│ │ │ │ └── LogicalScan { table: supplier }
791+
│ │ │ └── LogicalScan { table: lineitem }
792+
│ │ └── LogicalScan { table: partsupp }
793+
│ └── LogicalScan { table: orders }
794+
└── LogicalScan { table: nation }
795+
PhysicalSort
796+
├── exprs:
797+
│ ┌── SortOrder { order: Asc }
798+
│ │ └── #0
799+
│ └── SortOrder { order: Desc }
800+
│ └── #1
801+
└── PhysicalProjection { exprs: [ #0, #1, #2 ] }
802+
└── PhysicalAgg
803+
├── aggrs:Agg(Sum)
804+
│ └── [ #2 ]
805+
├── groups: [ #0, #1 ]
806+
└── PhysicalProjection
807+
├── exprs:
808+
│ ┌── #47
809+
│ ├── Scalar(DatePart)
810+
│ │ └── [ "YEAR", #41 ]
811+
│ └── Sub
812+
│ ├── Mul
813+
│ │ ├── #21
814+
│ │ └── Sub
815+
│ │ ├── Cast { cast_to: Decimal128(0), expr: 1 }
816+
│ │ └── #22
817+
│ └── Mul
818+
│ ├── #35
819+
│ └── #20
820+
└── PhysicalFilter
821+
├── cond:And
822+
│ ├── And
823+
│ │ ├── And
824+
│ │ │ ├── And
825+
│ │ │ │ ├── And
826+
│ │ │ │ │ ├── And
827+
│ │ │ │ │ │ ├── Eq
828+
│ │ │ │ │ │ │ ├── #9
829+
│ │ │ │ │ │ │ └── #18
830+
│ │ │ │ │ │ └── Eq
831+
│ │ │ │ │ │ ├── #33
832+
│ │ │ │ │ │ └── #18
833+
│ │ │ │ │ └── Eq
834+
│ │ │ │ │ ├── #32
835+
│ │ │ │ │ └── #17
836+
│ │ │ │ └── Eq
837+
│ │ │ │ ├── #0
838+
│ │ │ │ └── #17
839+
│ │ │ └── Eq
840+
│ │ │ ├── #37
841+
│ │ │ └── #16
842+
│ │ └── Eq
843+
│ │ ├── #12
844+
│ │ └── #46
845+
│ └── Like { expr: #1, pattern: "%green%" }
846+
└── PhysicalNestedLoopJoin { join_type: Cross, cond: true }
847+
├── PhysicalNestedLoopJoin { join_type: Cross, cond: true }
848+
│ ├── PhysicalNestedLoopJoin { join_type: Cross, cond: true }
849+
│ │ ├── PhysicalNestedLoopJoin { join_type: Cross, cond: true }
850+
│ │ │ ├── PhysicalNestedLoopJoin { join_type: Cross, cond: true }
851+
│ │ │ │ ├── PhysicalScan { table: part }
852+
│ │ │ │ └── PhysicalScan { table: supplier }
853+
│ │ │ └── PhysicalScan { table: lineitem }
854+
│ │ └── PhysicalScan { table: partsupp }
855+
│ └── PhysicalScan { table: orders }
856+
└── PhysicalScan { table: nation }
857+
*/
858+

0 commit comments

Comments
 (0)