Skip to content

Commit b22815a

Browse files
author
John Bodley
committed
[gather_columns] Traversing function calls
1 parent 33f6083 commit b22815a

2 files changed

Lines changed: 21 additions & 7 deletions

File tree

examples/gather_columns.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@
1616

1717
from lacquer import parser
1818
from lacquer.tree import AliasedRelation
19-
from lacquer.tree import Join
2019
from lacquer.tree import DefaultTraversalVisitor
20+
from lacquer.tree import FunctionCall
21+
from lacquer.tree import Join
2122
from lacquer.tree import QualifiedNameReference
2223
from lacquer.tree import SingleColumn
2324
from lacquer.tree import Table
@@ -48,13 +49,25 @@ def visit_query_specification(self, node, context):
4849
self.tables.append(node.from_)
4950
self.tables.reverse()
5051

52+
def get_all_qualified(expression, qualified=None):
53+
if qualified is None:
54+
qualified = []
55+
56+
if isinstance(expression, QualifiedNameReference):
57+
qualified.append(expression)
58+
elif isinstance(expression, FunctionCall):
59+
for argument in expression.arguments:
60+
get_all_qualified(argument, qualified)
61+
62+
return qualified
63+
5164
def print_column_resolution_order(columns, tables):
5265
table_columns = []
5366
tables_and_aliases = OrderedDict()
5467
for i in range(len(columns)):
5568
column = columns[i]
56-
if isinstance(column.expression, QualifiedNameReference):
57-
table_columns.append((column, i))
69+
for qualified in get_all_qualified(column.expression):
70+
table_columns.append((qualified, i))
5871

5972
for table in tables:
6073
if isinstance(table, AliasedRelation):
@@ -67,8 +80,7 @@ def print_column_resolution_order(columns, tables):
6780

6881
print("\nTable Column Resolution:")
6982
for (column, position) in table_columns:
70-
names = column.expression.name.parts
71-
column_name = names[-1]
83+
names = column.name.parts
7284
resolution = []
7385
if len(names) > 1:
7486
qualified_table_name = ".".join(names[:-1])
@@ -114,7 +126,8 @@ def visit_subquery_expression(self, node, context):
114126
check_extracted_columns("select (select 1 from foo), a "
115127
"from c join d using(foo) join e using (bar)")
116128
check_extracted_columns("select 1, 20+a from c join d using(foo) join e using (bar)")
117-
129+
check_extracted_columns("select sum(foo) from a", True)
130+
check_extracted_columns("select concat(concat(foo)) from a", True)
118131
print("Running subquery checkers\n\n")
119132
check_has_subquery("select a from b")
120133
check_has_subquery("select a from (select a from b)")

test/test_presto_tests.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,4 +332,5 @@ def select_list_with_items(*args):
332332

333333

334334
def simple_query(select, from_=None):
335-
return Query(query_body=QuerySpecification(select=select, from_=from_))
335+
return Query(query_body=QuerySpecification(select=select, from_=from_))
336+

0 commit comments

Comments
 (0)