|
855 | 855 | └─StreamOverWindow { window_functions: [row_number() OVER(PARTITION BY t.x ORDER BY t.y ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)] }
|
856 | 856 | └─StreamExchange { dist: HashShard(t.x) }
|
857 | 857 | └─StreamTableScan { table: t, columns: [t.x, t.y, t.z, t._row_id], stream_scan_type: ArrangementBackfill, stream_key: [t._row_id], pk: [_row_id], dist: UpstreamHashShard(t._row_id) }
|
| 858 | +- name: test ibis window function optimization |
| 859 | + sql: | |
| 860 | + CREATE TABLE t (a INT, b INT, c INT); |
| 861 | + SELECT a, b, c |
| 862 | + FROM ( |
| 863 | + SELECT |
| 864 | + a, b, c, |
| 865 | + ROW_NUMBER() OVER (PARTITION BY a ORDER BY b) - 1 AS rn |
| 866 | + FROM t |
| 867 | + ) |
| 868 | + WHERE rn < 10; |
| 869 | + logical_plan: |- |
| 870 | + LogicalProject { exprs: [t.a, t.b, t.c] } |
| 871 | + └─LogicalFilter { predicate: ($expr1 < 10:Int32) } |
| 872 | + └─LogicalProject { exprs: [t.a, t.b, t.c, (row_number - 1:Int32) as $expr1] } |
| 873 | + └─LogicalOverWindow { window_functions: [row_number() OVER(PARTITION BY t.a ORDER BY t.b ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)] } |
| 874 | + └─LogicalProject { exprs: [t.a, t.b, t.c, t._row_id, t._rw_timestamp] } |
| 875 | + └─LogicalScan { table: t, columns: [t.a, t.b, t.c, t._row_id, t._rw_timestamp] } |
| 876 | + optimized_logical_plan_for_batch: |- |
| 877 | + LogicalTopN { order: [t.b ASC], limit: 10, offset: 0, group_key: [t.a] } |
| 878 | + └─LogicalScan { table: t, columns: [t.a, t.b, t.c] } |
| 879 | + optimized_logical_plan_for_stream: |- |
| 880 | + LogicalTopN { order: [t.b ASC], limit: 10, offset: 0, group_key: [t.a] } |
| 881 | + └─LogicalScan { table: t, columns: [t.a, t.b, t.c] } |
| 882 | +- name: test arithmetic with addition |
| 883 | + sql: | |
| 884 | + CREATE TABLE t (a INT, b INT, c INT); |
| 885 | + SELECT a, b, c |
| 886 | + FROM ( |
| 887 | + SELECT |
| 888 | + a, b, c, |
| 889 | + ROW_NUMBER() OVER (PARTITION BY a ORDER BY b) + 5 AS rn_plus_five |
| 890 | + FROM t |
| 891 | + ) |
| 892 | + WHERE rn_plus_five = 6; |
| 893 | + logical_plan: |- |
| 894 | + LogicalProject { exprs: [t.a, t.b, t.c] } |
| 895 | + └─LogicalFilter { predicate: ($expr1 = 6:Int32) } |
| 896 | + └─LogicalProject { exprs: [t.a, t.b, t.c, (row_number + 5:Int32) as $expr1] } |
| 897 | + └─LogicalOverWindow { window_functions: [row_number() OVER(PARTITION BY t.a ORDER BY t.b ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)] } |
| 898 | + └─LogicalProject { exprs: [t.a, t.b, t.c, t._row_id, t._rw_timestamp] } |
| 899 | + └─LogicalScan { table: t, columns: [t.a, t.b, t.c, t._row_id, t._rw_timestamp] } |
| 900 | + optimized_logical_plan_for_batch: |- |
| 901 | + LogicalTopN { order: [t.b ASC], limit: 1, offset: 0, group_key: [t.a] } |
| 902 | + └─LogicalScan { table: t, columns: [t.a, t.b, t.c] } |
| 903 | + optimized_logical_plan_for_stream: |- |
| 904 | + LogicalTopN { order: [t.b ASC], limit: 1, offset: 0, group_key: [t.a] } |
| 905 | + └─LogicalScan { table: t, columns: [t.a, t.b, t.c] } |
| 906 | +- name: test optimization when rn column is kept |
| 907 | + sql: | |
| 908 | + CREATE TABLE t (a INT, b INT, c INT); |
| 909 | + SELECT a, b, c, rn_plus_one |
| 910 | + FROM ( |
| 911 | + SELECT |
| 912 | + a, b, c, |
| 913 | + ROW_NUMBER() OVER (PARTITION BY a ORDER BY b) + 1 AS rn_plus_one |
| 914 | + FROM t |
| 915 | + ) |
| 916 | + WHERE rn_plus_one = 2; |
| 917 | + logical_plan: |- |
| 918 | + LogicalProject { exprs: [t.a, t.b, t.c, $expr1] } |
| 919 | + └─LogicalFilter { predicate: ($expr1 = 2:Int32) } |
| 920 | + └─LogicalProject { exprs: [t.a, t.b, t.c, (row_number + 1:Int32) as $expr1] } |
| 921 | + └─LogicalOverWindow { window_functions: [row_number() OVER(PARTITION BY t.a ORDER BY t.b ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)] } |
| 922 | + └─LogicalProject { exprs: [t.a, t.b, t.c, t._row_id, t._rw_timestamp] } |
| 923 | + └─LogicalScan { table: t, columns: [t.a, t.b, t.c, t._row_id, t._rw_timestamp] } |
| 924 | + optimized_logical_plan_for_batch: |- |
| 925 | + LogicalProject { exprs: [t.a, t.b, t.c, (row_number + 1:Int32) as $expr1] } |
| 926 | + └─LogicalOverWindow { window_functions: [row_number() OVER(PARTITION BY t.a ORDER BY t.b ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)] } |
| 927 | + └─LogicalTopN { order: [t.b ASC], limit: 1, offset: 0, group_key: [t.a] } |
| 928 | + └─LogicalScan { table: t, columns: [t.a, t.b, t.c] } |
| 929 | + optimized_logical_plan_for_stream: |- |
| 930 | + LogicalProject { exprs: [t.a, t.b, t.c, (row_number + 1:Int32) as $expr1] } |
| 931 | + └─LogicalOverWindow { window_functions: [row_number() OVER(PARTITION BY t.a ORDER BY t.b ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)] } |
| 932 | + └─LogicalTopN { order: [t.b ASC], limit: 1, offset: 0, group_key: [t.a] } |
| 933 | + └─LogicalScan { table: t, columns: [t.a, t.b, t.c] } |
| 934 | +- name: test complex arithmetic not optimized |
| 935 | + sql: | |
| 936 | + CREATE TABLE t (a INT, b INT, c INT); |
| 937 | + SELECT a, b, c, rn |
| 938 | + FROM ( |
| 939 | + SELECT |
| 940 | + a, b, c, |
| 941 | + ROW_NUMBER() OVER (PARTITION BY a ORDER BY b) * 2 + 1 AS rn |
| 942 | + FROM t |
| 943 | + ) |
| 944 | + WHERE rn = 3; |
| 945 | + logical_plan: |- |
| 946 | + LogicalProject { exprs: [t.a, t.b, t.c, $expr1] } |
| 947 | + └─LogicalFilter { predicate: ($expr1 = 3:Int32) } |
| 948 | + └─LogicalProject { exprs: [t.a, t.b, t.c, ((row_number * 2:Int32) + 1:Int32) as $expr1] } |
| 949 | + └─LogicalOverWindow { window_functions: [row_number() OVER(PARTITION BY t.a ORDER BY t.b ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)] } |
| 950 | + └─LogicalProject { exprs: [t.a, t.b, t.c, t._row_id, t._rw_timestamp] } |
| 951 | + └─LogicalScan { table: t, columns: [t.a, t.b, t.c, t._row_id, t._rw_timestamp] } |
| 952 | + optimized_logical_plan_for_batch: |- |
| 953 | + LogicalProject { exprs: [t.a, t.b, t.c, ((row_number * 2:Int32) + 1:Int32) as $expr1] } |
| 954 | + └─LogicalFilter { predicate: (((row_number * 2:Int32) + 1:Int32) = 3:Int32) } |
| 955 | + └─LogicalOverWindow { window_functions: [row_number() OVER(PARTITION BY t.a ORDER BY t.b ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)] } |
| 956 | + └─LogicalScan { table: t, columns: [t.a, t.b, t.c] } |
| 957 | + optimized_logical_plan_for_stream: |- |
| 958 | + LogicalProject { exprs: [t.a, t.b, t.c, ((row_number * 2:Int32) + 1:Int32) as $expr1] } |
| 959 | + └─LogicalFilter { predicate: (((row_number * 2:Int32) + 1:Int32) = 3:Int32) } |
| 960 | + └─LogicalOverWindow { window_functions: [row_number() OVER(PARTITION BY t.a ORDER BY t.b ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)] } |
| 961 | + └─LogicalScan { table: t, columns: [t.a, t.b, t.c] } |
858 | 962 | - id: create_bid
|
859 | 963 | sql: |
|
860 | 964 | /*
|
|
0 commit comments