@@ -104,22 +104,23 @@ select_where(#select{where = Where}) ->
104104 Where .
105105
106106preprocess (# select {fields = Fields , is_foreach = IsForeach , doeach = DoEach , incase = InCase , from = Hooks , where = Conditions }) ->
107- Selected = [preprocess_field (Field ) || Field <- Fields ],
108107 Froms = [hook (unquote (H )) || H <- Hooks ],
109- FullColumns = as_columns (Selected ) ++ fixed_columns (Froms ),
108+ FixedColumns = fixed_columns (Froms ),
109+ Selected = [preprocess_field (Field , FixedColumns ) || Field <- Fields ],
110+ FullColumns = as_columns (Selected ) ++ FixedColumns ,
110111 # select {is_foreach = IsForeach ,
111112 fields = Selected ,
112- doeach = [preprocess_field (Each ) || Each <- DoEach ],
113+ doeach = [preprocess_field (Each , FullColumns ) || Each <- DoEach ],
113114 incase = preprocess_condition (InCase , FullColumns ),
114115 from = Froms ,
115116 where = preprocess_condition (Conditions , FullColumns )}.
116117
117- preprocess_field (<<" *" >>) ->
118+ preprocess_field (<<" *" >>, _Columns ) ->
118119 '*' ;
119- preprocess_field ({'as' , Field , Alias }) when is_binary (Alias ) ->
120- {'as' , transform_select_field (Field ), transform_alias (Alias )};
121- preprocess_field (Field ) ->
122- transform_select_field (Field ).
120+ preprocess_field ({'as' , Field , Alias }, Columns ) when is_binary (Alias ) ->
121+ {'as' , transform_select_field (Field , Columns ), transform_alias (Alias )};
122+ preprocess_field (Field , Columns ) ->
123+ transform_select_field (Field , Columns ).
123124
124125preprocess_condition ({Op , L , R }, Columns ) when ? is_logical (Op ) orelse ? is_comp (Op ) ->
125126 {Op , preprocess_condition (L , Columns ), preprocess_condition (R , Columns )};
@@ -151,15 +152,31 @@ do_transform_field({'fun', Name, Args}, Columns) when is_binary(Name) ->
151152 Fun = list_to_existing_atom (binary_to_list (Name )),
152153 {'fun' , Fun , [transform_field (Arg , Columns ) || Arg <- Args ]}.
153154
154- transform_select_field ({const , Val }) ->
155+ transform_select_field ({const , Val }, _Columns ) ->
155156 {const , Val };
156- transform_select_field ({Op , Arg1 , Arg2 }) when ? is_arith (Op ) ->
157- {Op , transform_select_field (Arg1 ), transform_select_field (Arg2 )};
158- transform_select_field (Var ) when is_binary (Var ) ->
159- {var , escape (parse_nested (Var ))};
160- transform_select_field ({'fun' , Name , Args }) when is_binary (Name ) ->
157+ transform_select_field ({Op , Arg1 , Arg2 }, Columns ) when ? is_arith (Op ) ->
158+ {Op , transform_select_field (Arg1 , Columns ), transform_select_field (Arg2 , Columns )};
159+ transform_select_field (Var , Columns ) when is_binary (Var ) ->
160+ {var , validate_var (escape (parse_nested (Var )), Columns )};
161+ transform_select_field ({'case' , CaseOn , CaseClauses , ElseClause }, Columns ) ->
162+ {'case' , transform_caseon (CaseOn , Columns ),
163+ transform_case_clause (CaseClauses , Columns ),
164+ transform_caseelse (ElseClause , Columns )};
165+ transform_select_field ({'fun' , Name , Args }, Columns ) when is_binary (Name ) ->
161166 Fun = list_to_existing_atom (binary_to_list (Name )),
162- {'fun' , Fun , [transform_select_field (Arg ) || Arg <- Args ]}.
167+ {'fun' , Fun , [transform_select_field (Arg , Columns ) || Arg <- Args ]}.
168+
169+ transform_caseon (<<>>, _Columns ) -> undefined ;
170+ transform_caseon (CaseOn , Columns ) ->
171+ transform_select_field (CaseOn , Columns ).
172+
173+ transform_case_clause (CaseClauses , Columns ) ->
174+ [{preprocess_condition (Cond , Columns ), transform_select_field (Return , Columns )}
175+ || {Cond , Return } <- CaseClauses ].
176+
177+ transform_caseelse ({}, _Columns ) -> undefined ;
178+ transform_caseelse (ElseClause , Columns ) ->
179+ transform_select_field (ElseClause , Columns ).
163180
164181validate_var (Var , SupportedColumns ) ->
165182 case {Var , lists :member (Var , SupportedColumns )} of
0 commit comments