@@ -20,7 +20,6 @@ var DefaultRules = []Rule{
2020 {"resolve_database" , resolveDatabase },
2121 {"resolve_star" , resolveStar },
2222 {"resolve_functions" , resolveFunctions },
23- {"resolve_getfield_indexes" , resolveGetFieldIndexes },
2423 {"reorder_projection" , reorderProjection },
2524 {"pushdown" , pushdown },
2625 {"optimize_distinct" , optimizeDistinct },
@@ -326,8 +325,6 @@ type column interface {
326325 sql.Expression
327326}
328327
329- const unresolvedGetFieldIndex = - 1
330-
331328func resolveColumns (ctx * sql.Context , a * Analyzer , n sql.Node ) (sql.Node , error ) {
332329 span , ctx := ctx .Span ("resolve_columns" )
333330 defer span .Finish ()
@@ -350,7 +347,12 @@ func resolveColumns(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error)
350347 }
351348 }
352349
353- return n .TransformExpressionsUp (func (e sql.Expression ) (sql.Expression , error ) {
350+ expressioner , ok := n .(sql.Expressioner )
351+ if ! ok {
352+ return n , nil
353+ }
354+
355+ return expressioner .TransformExpressions (func (e sql.Expression ) (sql.Expression , error ) {
354356 a .Log ("transforming expression of type: %T" , e )
355357 if n .Resolved () {
356358 return e , nil
@@ -398,10 +400,26 @@ func resolveColumns(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error)
398400 }
399401 }
400402
403+ var schema sql.Schema
404+ switch n := n .(type ) {
405+ // If expressioner and unary node we must take the
406+ // child's schema to correctly select the indexes
407+ // in the row is going to be evaluated in this node
408+ case * plan.Project , * plan.Filter , * plan.GroupBy , * plan.Sort :
409+ schema = n .Children ()[0 ].Schema ()
410+ default :
411+ schema = n .Schema ()
412+ }
413+
414+ idx , ok := schema .Contains (col .Name , col .Source )
415+ if ! ok {
416+ return nil , ErrColumnNotFound .New (col .Name )
417+ }
418+
401419 a .Log ("column resolved to %q.%q" , col .Source , col .Name )
402420
403421 return expression .NewGetFieldWithTable (
404- unresolvedGetFieldIndex ,
422+ idx ,
405423 col .Type ,
406424 col .Source ,
407425 col .Name ,
@@ -805,66 +823,3 @@ func fixFieldIndexes(schema sql.Schema, exp sql.Expression) (sql.Expression, err
805823 return e , nil
806824 })
807825}
808-
809- // resolveGetFieldIndexes set the index attribute for each GetField expression with a value referring to
810- // the node containing this expression. It should be run after resolveColumns
811- func resolveGetFieldIndexes (ctx * sql.Context , a * Analyzer , node sql.Node ) (sql.Node , error ) {
812- span , ctx := ctx .Span ("fix join fields" )
813- defer span .Finish ()
814-
815- a .Log ("fix join fields, node of type: %T" , node )
816- return node .TransformUp (func (n sql.Node ) (sql.Node , error ) {
817- a .Log ("transforming node of type: %T" , n )
818- if ! n .Resolved () {
819- return n , nil
820- }
821-
822- expressioner , ok := n .(sql.Expressioner )
823- if ! ok {
824- return n , nil
825- }
826-
827- return expressioner .TransformExpressions (func (e sql.Expression ) (sql.Expression , error ) {
828- a .Log ("transforming expression of type: %T" , e )
829- if ! e .Resolved () {
830- return e , nil
831- }
832-
833- field , ok := e .(* expression.GetField )
834- if ! ok {
835- return e , nil
836- }
837-
838- if field .Index () != unresolvedGetFieldIndex {
839- return e , nil
840- }
841-
842- var schema sql.Schema
843- switch n := n .(type ) {
844- // If expressioner and unary node we must take the
845- // child's schema to correctly select the indexes
846- // in the row is going to be evaluated in this node
847- case * plan.Project , * plan.Filter , * plan.GroupBy , * plan.Sort :
848- schema = n .Children ()[0 ].Schema ()
849- default :
850- schema = n .Schema ()
851- }
852-
853- idx , ok := schema .Contains (field .Name (), field .Table ())
854- if ! ok {
855- return nil , ErrColumnNotFound .New (field .Name ())
856- }
857-
858- fixedField := expression .NewGetFieldWithTable (
859- idx ,
860- field .Type (),
861- field .Table (),
862- field .Name (),
863- field .IsNullable (),
864- )
865-
866- a .Log ("fixed expression %T for %T" , field , n )
867- return fixedField , nil
868- })
869- })
870- }
0 commit comments