1616
1717from lacquer import parser
1818from lacquer .tree import AliasedRelation
19- from lacquer .tree import Join
2019from lacquer .tree import DefaultTraversalVisitor
20+ from lacquer .tree import FunctionCall
21+ from lacquer .tree import Join
2122from lacquer .tree import QualifiedNameReference
2223from lacquer .tree import SingleColumn
2324from 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 ("\n Table 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)" )
0 commit comments