@@ -390,7 +390,8 @@ def parse(union_expression):
390390
391391 def compile_select (self , expression , config , arguments ):
392392 primary_table = {"db" : None , "name" : None , "table_name" : None , "table_alias" : None , "seted_primary_keys" : False ,
393- "loader_primary_keys" : [], "outputer_primary_keys" : [], "columns" : {}, "subquery" : None , "select_columns" : {}}
393+ "loader_primary_keys" : [], "outputer_primary_keys" : [], "alias_primary_keys" : [],
394+ "columns" : {}, "subquery" : None , "select_columns" : {}}
394395
395396 from_expression = expression .args .get ("from" )
396397 if not from_expression :
@@ -460,9 +461,11 @@ def compile_select(self, expression, config, arguments):
460461 if self .is_column (select_expression , config , arguments ):
461462 column_expression = select_expression
462463 elif isinstance (select_expression , sqlglot_expressions .Alias ):
463- column_alias = select_expression .args ["alias" ].name if select_expression .args .get ("alias" ) else None
464- if column_alias and column_alias in self .mapping :
465- column_alias = self .mapping [column_alias ]
464+ column_alias = self .parse_column_alias (select_expression , config , arguments )
465+ if column_alias is not None :
466+ if column_alias ["typing_options" ] and "pk" in column_alias ["typing_options" ]:
467+ primary_table ["alias_primary_keys" ].append (column_alias ["column_alias" ])
468+ column_alias = column_alias ["column_alias" ]
466469 if self .is_const (select_expression .args ["this" ], config , arguments ):
467470 const_info = self .parse_const (select_expression .args ["this" ], config , arguments )
468471 config ["schema" ][column_alias ] = self .compile_const (select_expression .args ["this" ], config , arguments , const_info )
@@ -570,6 +573,8 @@ def compile_select(self, expression, config, arguments):
570573 if name in config ["aggregate" ]["schema" ]:
571574 continue
572575 config ["aggregate" ]["distinct_keys" ].append (copy .deepcopy (column ))
576+ if primary_table ["alias_primary_keys" ]:
577+ primary_table ["outputer_primary_keys" ] = primary_table ["alias_primary_keys" ]
573578 if not from_expression and not primary_table ["outputer_primary_keys" ] and isinstance (config ["schema" ], dict ):
574579 for column_alias in config ["schema" ]:
575580 if not column_alias .isidentifier ():
@@ -2762,6 +2767,26 @@ def parse_const(self, expression, config, arguments):
27622767 "expression" : expression ,
27632768 }
27642769
2770+ def parse_column_alias (self , expression , config , arguments ):
2771+ if not expression .args .get ("alias" ):
2772+ return None
2773+ origin_alias = expression .args ["alias" ].name
2774+ if origin_alias and origin_alias in self .mapping :
2775+ column_alias = self .mapping [origin_alias ]
2776+ else :
2777+ column_alias = origin_alias
2778+ try :
2779+ start_index , end_index = column_alias .index ("<" ), column_alias .rindex (">" )
2780+ typing_options = column_alias [start_index + 1 : end_index ].split ("," )
2781+ column_alias = column_alias [:start_index ]
2782+ except ValueError :
2783+ typing_options = []
2784+ return {
2785+ "origin_alias" : origin_alias ,
2786+ "column_alias" : column_alias ,
2787+ "typing_options" : typing_options ,
2788+ }
2789+
27652790 def parse_cast_typing_filter (self , expression , config , arguments ):
27662791 to_type = expression .args ["to" ].args ["this" ]
27672792 if to_type in sqlglot_expressions .DataType .FLOAT_TYPES :
0 commit comments