You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Add comprehensive test suite for column parsing functionality
- Add test/sql/parse_tools/table_functions/parse_columns.test with 25+ test cases
covering basic columns, schema qualification, alias chains, multi-table joins,
nested struct fields, different SQL contexts, and complex expressions
- Add test/sql/parse_tools/table_functions/parse_columns_edge_cases.test with
edge cases including NULL handling, deeply nested expressions, self-joins,
and error conditions
- Add test/sql/parse_tools/scalar_functions/parse_columns.test placeholder
for future scalar function implementation
- Tests follow DuckDB extension test format with proper require statements
and comprehensive coverage of all column parsing features
- Verified functionality with manual testing showing correct parsing of
alias chains, nested struct access, and complex SQL expressions
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <[email protected]>
# description: test parse_columns table function edge cases and special scenarios
3
+
# group: [parse_columns]
4
+
5
+
require parser_tools
6
+
7
+
# Test NULL values in output (schema/table missing for unqualified columns)
8
+
query IIIIIII
9
+
SELECT expression_identifiers, table_schema IS NULL as schema_null, table_name IS NULL as table_null, column_name, selected_name IS NULL as selected_null
10
+
FROM parse_columns('SELECT name FROM users;');
11
+
----
12
+
[["name"]] 1 1 name 1
13
+
14
+
# Test that only input columns are returned (selected_name IS NULL)
15
+
query I
16
+
SELECT COUNT(*) FROM parse_columns('SELECT name AS user_name, age FROM users;') WHERE selected_name IS NULL;
17
+
----
18
+
2
19
+
20
+
# Test that output columns are correctly identified
21
+
query I
22
+
SELECT COUNT(*) FROM parse_columns('SELECT name AS user_name, age FROM users;') WHERE selected_name IS NOT NULL;
23
+
----
24
+
1
25
+
26
+
# Test extremely long qualification chain
27
+
query IIIIIII
28
+
SELECT * FROM parse_columns('SELECT main.schema1.table1.col1.field1.subfield1 FROM main.schema1.table1;');
29
+
----
30
+
[["main","schema1","table1","col1","field1","subfield1"]] main schema1 table1 select main.schema1.table1.col1.field1.subfield1 NULL
31
+
32
+
# Test column with same name as table
33
+
query IIIIIII
34
+
SELECT * FROM parse_columns('SELECT users.users FROM users;');
35
+
----
36
+
[["users","users"]] main users users select users.users NULL
37
+
38
+
# Test multiple references to same column in different contexts
39
+
query I
40
+
SELECT COUNT(*) FROM parse_columns('SELECT name FROM users WHERE name IS NOT NULL ORDER BY name;');
41
+
----
42
+
3
43
+
44
+
# Test expression with no column references (literals only)
45
+
query I
46
+
SELECT COUNT(*) FROM parse_columns('SELECT 1 + 2 * 3 AS result;');
47
+
----
48
+
0
49
+
50
+
# Test complex nested function calls
51
+
query I
52
+
SELECT COUNT(*) FROM parse_columns('SELECT UPPER(LOWER(SUBSTR(name, 1, 3))) FROM users;') WHERE context = 'function_arg';
53
+
----
54
+
1
55
+
56
+
# Test window function with multiple column references
57
+
query I
58
+
SELECT COUNT(*) FROM parse_columns('SELECT ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC, name ASC) FROM employees;');
59
+
----
60
+
3
61
+
62
+
# Test CASE expression with multiple column references
63
+
query I
64
+
SELECT COUNT(*) FROM parse_columns('SELECT CASE WHEN age > 65 THEN "senior" WHEN age > 18 THEN "adult" ELSE "minor" END FROM users;');
65
+
----
66
+
2
67
+
68
+
# Test columns in aggregate function with GROUP BY
69
+
query I
70
+
SELECT COUNT(*) FROM parse_columns('SELECT dept, COUNT(employee_id), AVG(salary) FROM employees GROUP BY dept;');
71
+
----
72
+
4
73
+
74
+
# Test deeply nested subquery column references
75
+
query I
76
+
SELECT COUNT(*) FROM parse_columns('SELECT name FROM (SELECT name FROM (SELECT name FROM users) t1) t2;');
77
+
----
78
+
3
79
+
80
+
# Test self-join with table aliases
81
+
query I
82
+
SELECT COUNT(*) FROM parse_columns('SELECT a.name, b.name FROM users a JOIN users b ON a.manager_id = b.id;');
83
+
----
84
+
4
85
+
86
+
# Test column in HAVING clause
87
+
query I
88
+
SELECT COUNT(*) FROM parse_columns('SELECT dept FROM employees GROUP BY dept HAVING COUNT(*) > 5 AND AVG(salary) > 50000;');
89
+
----
90
+
3
91
+
92
+
# Test UNION with column references
93
+
query I
94
+
SELECT COUNT(*) FROM parse_columns('SELECT name FROM users UNION SELECT name FROM employees;');
95
+
----
96
+
2
97
+
98
+
# Test INSERT with column references (should return empty as INSERT not supported)
99
+
query I
100
+
SELECT COUNT(*) FROM parse_columns('INSERT INTO users (name, age) VALUES ("John", 25);');
101
+
----
102
+
0
103
+
104
+
# Test UPDATE statement (should return empty as UPDATE not supported)
105
+
query I
106
+
SELECT COUNT(*) FROM parse_columns('UPDATE users SET age = 26 WHERE name = "John";');
107
+
----
108
+
0
109
+
110
+
# Test arithmetic with multiple column references and complex expressions
111
+
query I
112
+
SELECT COUNT(*) FROM parse_columns('SELECT (salary * 1.1) + (bonus * 0.5) - tax AS net_pay FROM employees;');
113
+
----
114
+
3
115
+
116
+
# Test column references in JOIN conditions
117
+
query I
118
+
SELECT COUNT(*) FROM parse_columns('SELECT u.name FROM users u JOIN orders o ON u.id = o.user_id AND u.status = "active";');
119
+
----
120
+
4
121
+
122
+
# Test column with special characters in name (quoted)
123
+
query IIIIIII
124
+
SELECT * FROM parse_columns('SELECT "user name", "order-total" FROM "my table";');
125
+
----
126
+
[["user name"]] NULL NULL user name select "user name" NULL
0 commit comments