Skip to content

Commit 7c0b283

Browse files
committed
parser
1 parent a7570ab commit 7c0b283

File tree

8 files changed

+521
-118
lines changed

8 files changed

+521
-118
lines changed

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/values/RelOpValue.java

Lines changed: 115 additions & 113 deletions
Large diffs are not rendered by default.

fdb-relational-core/src/main/antlr/RelationalLexer.g4

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,6 @@ INSERT: 'INSERT';
127127
INTERVAL: 'INTERVAL';
128128
INTO: 'INTO';
129129
IS: 'IS';
130-
IS_DISTINCT_FROM: 'IS DISTINCT FROM';
131-
IS_NOT_DISTINCT_FROM: 'IS NOT DISTINCT FROM';
132130
ITERATE: 'ITERATE';
133131
JOIN: 'JOIN';
134132
KEY: 'KEY';

fdb-relational-core/src/main/antlr/RelationalParser.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1164,7 +1164,7 @@ unaryOperator
11641164
comparisonOperator
11651165
: '=' | '>' | '<' | '<' '=' | '>' '='
11661166
| '<' '>' | '!' '=' // | '<' '=' '>' // no support for null-safe equality
1167-
| IS_DISTINCT_FROM | IS_NOT_DISTINCT_FROM
1167+
| IS NOT? DISTINCT FROM
11681168
;
11691169

11701170
logicalOperator

fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/functions/SqlFunctionCatalogImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@ private static ImmutableMap<String, Function<Integer, Optional<BuiltInFunction<?
145145
.put("coalesce", argumentsCount -> BuiltInFunctionCatalog.resolve("coalesce", argumentsCount))
146146
.put("is null", argumentsCount -> BuiltInFunctionCatalog.resolve("isNull", argumentsCount))
147147
.put("is not null", argumentsCount -> BuiltInFunctionCatalog.resolve("notNull", argumentsCount))
148-
.put("is distinct from", argumentsCount -> BuiltInFunctionCatalog.resolve("isDistinctFrom", argumentsCount))
149-
.put("is not distinct from", argumentsCount -> BuiltInFunctionCatalog.resolve("notDistinctFrom", argumentsCount))
148+
.put("isdistinctfrom", argumentsCount -> BuiltInFunctionCatalog.resolve("isDistinctFrom", argumentsCount))
149+
.put("isnotdistinctfrom", argumentsCount -> BuiltInFunctionCatalog.resolve("notDistinctFrom", argumentsCount))
150150
.put("range", argumentsCount -> BuiltInFunctionCatalog.resolve("range", argumentsCount))
151151
.put("__pattern_for_like", argumentsCount -> BuiltInFunctionCatalog.resolve("patternForLike", argumentsCount))
152152
.put("__internal_array", argumentsCount -> BuiltInFunctionCatalog.resolve("array", argumentsCount))

yaml-tests/src/test/java/YamlIntegrationTests.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,11 @@ void like(YamlTest.Runner runner) throws Exception {
194194
runner.runYamsql("like.yamsql");
195195
}
196196

197+
@TestTemplate
198+
void distinctFrom(YamlTest.Runner runner) throws Exception {
199+
runner.runYamsql("distinct-from.yamsql");
200+
}
201+
197202
@TestTemplate
198203
void functions(YamlTest.Runner runner) throws Exception {
199204
runner.runYamsql("functions.yamsql");

yaml-tests/src/test/resources/distinct-from.metrics.binpb

Lines changed: 167 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
distinct-from-tests:
2+
- query: EXPLAIN select * from t1 WHERE col2 is distinct from null
3+
explain: ISCAN(I2 ([null],>)
4+
task_count: 668
5+
task_total_time_ms: 209
6+
transform_count: 182
7+
transform_time_ms: 132
8+
transform_yield_count: 55
9+
insert_time_ms: 12
10+
insert_new_count: 69
11+
insert_reused_count: 9
12+
- query: EXPLAIN select * from t1 WHERE col1 is DISTINCT from 10
13+
explain: 'COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.COL1 IS_DISTINCT_FROM
14+
promote(@c10 AS INT) | FETCH'
15+
task_count: 683
16+
task_total_time_ms: 41
17+
transform_count: 182
18+
transform_time_ms: 14
19+
transform_yield_count: 53
20+
insert_time_ms: 3
21+
insert_new_count: 74
22+
insert_reused_count: 9
23+
- query: EXPLAIN select * from t1 WHERE null is distinct from col2
24+
explain: ISCAN(I2 ([null],>)
25+
task_count: 668
26+
task_total_time_ms: 209
27+
transform_count: 182
28+
transform_time_ms: 134
29+
transform_yield_count: 55
30+
insert_time_ms: 12
31+
insert_new_count: 69
32+
insert_reused_count: 9
33+
- query: EXPLAIN select * from t1 WHERE 10 is distinct from col1
34+
explain: 'COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.COL1 IS_DISTINCT_FROM
35+
promote(@c6 AS INT) | FETCH'
36+
task_count: 683
37+
task_total_time_ms: 39
38+
transform_count: 182
39+
transform_time_ms: 14
40+
transform_yield_count: 53
41+
insert_time_ms: 3
42+
insert_new_count: 74
43+
insert_reused_count: 9
44+
- query: EXPLAIN select * from t1 WHERE null is distinct from null
45+
explain: 'COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER false | FETCH'
46+
task_count: 721
47+
task_total_time_ms: 207
48+
transform_count: 192
49+
transform_time_ms: 131
50+
transform_yield_count: 56
51+
insert_time_ms: 15
52+
insert_new_count: 81
53+
insert_reused_count: 10
54+
- query: EXPLAIN select * from t1 WHERE 10 is distinct from 10
55+
explain: 'COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER @c6 IS_DISTINCT_FROM
56+
@c6 | FETCH'
57+
task_count: 721
58+
task_total_time_ms: 207
59+
transform_count: 192
60+
transform_time_ms: 135
61+
transform_yield_count: 56
62+
insert_time_ms: 13
63+
insert_new_count: 81
64+
insert_reused_count: 10
65+
not-distinct-from-tests:
66+
- query: EXPLAIN select * from t1 WHERE col2 is not distinct from null
67+
explain: ISCAN(I2 [[null],[null]])
68+
task_count: 668
69+
task_total_time_ms: 47
70+
transform_count: 181
71+
transform_time_ms: 17
72+
transform_yield_count: 55
73+
insert_time_ms: 3
74+
insert_new_count: 69
75+
insert_reused_count: 9
76+
- query: EXPLAIN select * from t1 WHERE col1 is not distinct from 20
77+
explain: 'COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.COL1 NOT_DISTINCT_FROM
78+
promote(@c11 AS INT) | FETCH'
79+
task_count: 683
80+
task_total_time_ms: 48
81+
transform_count: 183
82+
transform_time_ms: 18
83+
transform_yield_count: 53
84+
insert_time_ms: 3
85+
insert_new_count: 74
86+
insert_reused_count: 9
87+
- query: EXPLAIN select * from t1 WHERE null is not distinct from col2
88+
explain: ISCAN(I2 [[null],[null]])
89+
task_count: 668
90+
task_total_time_ms: 46
91+
transform_count: 181
92+
transform_time_ms: 17
93+
transform_yield_count: 55
94+
insert_time_ms: 3
95+
insert_new_count: 69
96+
insert_reused_count: 9
97+
- query: EXPLAIN select * from t1 WHERE 20 is not distinct from col1
98+
explain: 'COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.COL1 NOT_DISTINCT_FROM
99+
promote(@c6 AS INT) | FETCH'
100+
task_count: 683
101+
task_total_time_ms: 27
102+
transform_count: 183
103+
transform_time_ms: 11
104+
transform_yield_count: 53
105+
insert_time_ms: 2
106+
insert_new_count: 74
107+
insert_reused_count: 9
108+
- query: EXPLAIN select count(*) from t1 WHERE null is not distinct from null
109+
explain: ISCAN(I2 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY
110+
NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)
111+
task_count: 723
112+
task_total_time_ms: 57
113+
transform_count: 204
114+
transform_time_ms: 26
115+
transform_yield_count: 60
116+
insert_time_ms: 3
117+
insert_new_count: 96
118+
insert_reused_count: 8
119+
- query: EXPLAIN select count(*) from t1 WHERE 10 is not distinct from 10
120+
explain: 'COVERING(I2 <,> -> [COL2: KEY[0], ID: KEY[2]]) | FILTER @c9 NOT_DISTINCT_FROM
121+
@c9 | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL |
122+
MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)'
123+
task_count: 861
124+
task_total_time_ms: 59
125+
transform_count: 220
126+
transform_time_ms: 24
127+
transform_yield_count: 62
128+
insert_time_ms: 3
129+
insert_new_count: 118
130+
insert_reused_count: 6
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#
2+
# distinct-from.yamsql
3+
#
4+
# This source file is part of the FoundationDB open source project
5+
#
6+
# Copyright 2021-2024 Apple Inc. and the FoundationDB project authors
7+
#
8+
# Licensed under the Apache License, Version 2.0 (the "License");
9+
# you may not use this file except in compliance with the License.
10+
# You may obtain a copy of the License at
11+
#
12+
# http://www.apache.org/licenses/LICENSE-2.0
13+
#
14+
# Unless required by applicable law or agreed to in writing, software
15+
# distributed under the License is distributed on an "AS IS" BASIS,
16+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17+
# See the License for the specific language governing permissions and
18+
# limitations under the License.
19+
20+
21+
---
22+
options:
23+
supported_version: !current_version
24+
---
25+
schema_template:
26+
create table t1(id integer, col1 integer, col2 integer, primary key(id))
27+
create index i1 as select col1 from t1
28+
create index cnt as select count(*) from t1
29+
create index i2 as select col2 from t1
30+
---
31+
setup:
32+
steps:
33+
- query: INSERT INTO T1
34+
VALUES (1, 10, 1),
35+
(2, 10, null),
36+
(3, 10, 3),
37+
(4, 10, null),
38+
(5, 10, 5),
39+
(6, 20, null),
40+
(7, 20, null),
41+
(8, 20, null),
42+
(9, 20, 9),
43+
(10, 20, 10)
44+
---
45+
test_block:
46+
name: distinct-from-tests
47+
tests:
48+
-
49+
- query: select * from t1 WHERE col2 is distinct from null
50+
- explain: "ISCAN(I2 ([null],>)"
51+
- result: [{ID: 1, 10, 1}, {ID: 3, 10, 3}, {ID: 5, 10, 5}, {ID: 9, 20, 9}, {ID: 10, 20, 10}]
52+
-
53+
- query: select * from t1 WHERE col1 is DISTINCT from 10
54+
- explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.COL1 IS_DISTINCT_FROM promote(@c10 AS INT) | FETCH"
55+
- result: [{ID: 6, 20, !null }, {ID: 7, 20, !null }, {ID: 8, 20, !null }, {ID: 9, 20, 9}, {ID: 10, 20, 10}]
56+
-
57+
- query: select * from t1 WHERE null is distinct from col2
58+
- explain: "ISCAN(I2 ([null],>)"
59+
- result: [{ID: 1, 10, 1}, {ID: 3, 10, 3}, {ID: 5, 10, 5}, {ID: 9, 20, 9}, {ID: 10, 20, 10}]
60+
-
61+
- query: select * from t1 WHERE 10 is distinct from col1
62+
- explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.COL1 IS_DISTINCT_FROM promote(@c6 AS INT) | FETCH"
63+
- result: [{ID: 6, 20, !null }, {ID: 7, 20, !null }, {ID: 8, 20, !null }, {ID: 9, 20, 9}, {ID: 10, 20, 10}]
64+
-
65+
- query: select * from t1 WHERE null is distinct from null
66+
- explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER false | FETCH"
67+
- result: []
68+
-
69+
- query: select * from t1 WHERE 10 is distinct from 10
70+
- explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER @c6 IS_DISTINCT_FROM @c6 | FETCH"
71+
- result: []
72+
73+
---
74+
test_block:
75+
name: not-distinct-from-tests
76+
tests:
77+
-
78+
- query: select * from t1 WHERE col2 is not distinct from null
79+
- explain: "ISCAN(I2 [[null],[null]])"
80+
- result: [{ID: 2, 10, !null }, {ID: 4, 10, !null }, {ID: 6, 20, !null }, {ID: 7, 20, !null }, {ID: 8, 20, !null }]
81+
-
82+
- query: select * from t1 WHERE col1 is not distinct from 20
83+
- explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.COL1 NOT_DISTINCT_FROM promote(@c11 AS INT) | FETCH"
84+
- result: [{ID: 6, 20, !null }, {ID: 7, 20, !null }, {ID: 8, 20, !null }, {ID: 9, 20, 9}, {ID: 10, 20, 10}]
85+
-
86+
- query: select * from t1 WHERE null is not distinct from col2
87+
- explain: "ISCAN(I2 [[null],[null]])"
88+
- result: [{ID: 2, 10, !null }, {ID: 4, 10, !null }, {ID: 6, 20, !null }, {ID: 7, 20, !null }, {ID: 8, 20, !null }]
89+
-
90+
- query: select * from t1 WHERE 20 is not distinct from col1
91+
- explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.COL1 NOT_DISTINCT_FROM promote(@c6 AS INT) | FETCH"
92+
- result: [{ID: 6, 20, !null }, {ID: 7, 20, !null }, {ID: 8, 20, !null }, {ID: 9, 20, 9}, {ID: 10, 20, 10}]
93+
-
94+
- query: select count(*) from t1 WHERE null is not distinct from null
95+
- explain: "ISCAN(I2 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)"
96+
- result: [{10}]
97+
-
98+
- query: select count(*) from t1 WHERE 10 is not distinct from 10
99+
- explain: "COVERING(I2 <,> -> [COL2: KEY[0], ID: KEY[2]]) | FILTER @c9 NOT_DISTINCT_FROM @c9 | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)"
100+
- result: [{10}]
101+
...

0 commit comments

Comments
 (0)