Skip to content

Commit 3535799

Browse files
author
lmangani
committed
add tests
1 parent c4b648e commit 3535799

File tree

2 files changed

+115
-2
lines changed

2 files changed

+115
-2
lines changed

src/parse_where.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -435,11 +435,21 @@ static void ParseWhereDetailedFunction(ClientContext &context,
435435
if (select_stmt.node) {
436436
if (select_stmt.node->type == QueryNodeType::SELECT_NODE) {
437437
auto &select_node = (SelectNode &)*select_stmt.node;
438+
string table_name = "(empty)"; // Default table name
439+
440+
// Try to extract table name from FROM clause
441+
if (select_node.from_table) {
442+
if (select_node.from_table->type == TableReferenceType::BASE_TABLE) {
443+
auto &base_table = (BaseTableRef &)*select_node.from_table;
444+
table_name = base_table.table_name;
445+
}
446+
}
447+
438448
if (select_node.where_clause) {
439-
ExtractDetailedWhereConditionsFromExpression(*select_node.where_clause, state.results, "WHERE");
449+
ExtractDetailedWhereConditionsFromExpression(*select_node.where_clause, state.results, "WHERE", table_name);
440450
}
441451
if (select_node.having) {
442-
ExtractDetailedWhereConditionsFromExpression(*select_node.having, state.results, "HAVING");
452+
ExtractDetailedWhereConditionsFromExpression(*select_node.having, state.results, "HAVING", table_name);
443453
}
444454
}
445455
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# name: test/sql/parser_tools/tables_functions/parse_where.test
2+
# description: test parse_where and parse_where_detailed table functions
3+
# group: [parse_where]
4+
5+
# Before we load the extension, this will fail
6+
statement error
7+
SELECT * FROM parse_where('SELECT * FROM my_table WHERE x > 1;');
8+
----
9+
Catalog Error: Table Function with name parse_where does not exist!
10+
11+
# Require statement will ensure this test is run with this extension loaded
12+
require parser_tools
13+
14+
# Simple comparison
15+
query III
16+
SELECT * FROM parse_where('SELECT * FROM my_table WHERE x > 1;');
17+
----
18+
(x > 1) (empty) WHERE
19+
20+
# Simple comparison with detailed parser
21+
query IIIII
22+
SELECT * FROM parse_where_detailed('SELECT * FROM my_table WHERE x > 1;');
23+
----
24+
x > 1 (empty) WHERE
25+
26+
# Multiple conditions with AND
27+
query III
28+
SELECT * FROM parse_where('SELECT * FROM my_table WHERE x > 1 AND y < 100;');
29+
----
30+
(x > 1) (empty) WHERE
31+
(y < 100) (empty) WHERE
32+
33+
# Multiple conditions with AND (detailed)
34+
query IIIII
35+
SELECT * FROM parse_where_detailed('SELECT * FROM my_table WHERE x > 1 AND y < 100;');
36+
----
37+
x > 1 (empty) WHERE
38+
y < 100 (empty) WHERE
39+
40+
# BETWEEN condition
41+
query III
42+
SELECT * FROM parse_where('SELECT * FROM my_table WHERE x BETWEEN 1 AND 100;');
43+
----
44+
(x BETWEEN 1 AND 100) (empty) WHERE
45+
46+
# BETWEEN condition (detailed)
47+
query IIIII
48+
SELECT * FROM parse_where_detailed('SELECT * FROM my_table WHERE x BETWEEN 1 AND 100;');
49+
----
50+
x >= 1 (empty) WHERE
51+
x <= 100 (empty) WHERE
52+
53+
# Complex conditions with AND/OR
54+
query III
55+
SELECT * FROM parse_where('SELECT * FROM my_table WHERE (x > 1 AND y < 100) OR z = 42;');
56+
----
57+
(x > 1) (empty) WHERE
58+
(y < 100) (empty) WHERE
59+
(z = 42) (empty) WHERE
60+
61+
# Complex conditions with AND/OR (detailed)
62+
query IIIII
63+
SELECT * FROM parse_where_detailed('SELECT * FROM my_table WHERE (x > 1 AND y < 100) OR z = 42;');
64+
----
65+
x > 1 (empty) WHERE
66+
y < 100 (empty) WHERE
67+
z = 42 (empty) WHERE
68+
69+
# Multiple operators
70+
query III
71+
SELECT * FROM parse_where('SELECT * FROM my_table WHERE x >= 1 AND x <= 100 AND y != 42;');
72+
----
73+
(x >= 1) (empty) WHERE
74+
(x <= 100) (empty) WHERE
75+
(y != 42) (empty) WHERE
76+
77+
# Multiple operators (detailed)
78+
query IIIII
79+
SELECT * FROM parse_where_detailed('SELECT * FROM my_table WHERE x >= 1 AND x <= 100 AND y != 42;');
80+
----
81+
x >= 1 (empty) WHERE
82+
x <= 100 (empty) WHERE
83+
y != 42 (empty) WHERE
84+
85+
# No WHERE clause
86+
query III
87+
SELECT * FROM parse_where('SELECT * FROM my_table;');
88+
----
89+
90+
# No WHERE clause (detailed)
91+
query IIIII
92+
SELECT * FROM parse_where_detailed('SELECT * FROM my_table;');
93+
----
94+
95+
# Malformed SQL should not error
96+
query III
97+
SELECT * FROM parse_where('SELECT * FROM my_table WHERE');
98+
----
99+
100+
# Malformed SQL should not error (detailed)
101+
query IIIII
102+
SELECT * FROM parse_where_detailed('SELECT * FROM my_table WHERE');
103+
----

0 commit comments

Comments
 (0)