@@ -206,6 +206,9 @@ func (b *Builder) buildScalar(inScope *scope, e ast.Expr) (ex sql.Expression) {
206
206
case * ast.GroupConcatExpr :
207
207
// TODO this is an aggregation
208
208
return b .buildGroupConcat (inScope , v )
209
+ case * ast.OrderedInjectedExpr :
210
+ // TODO this is an aggregation
211
+ return b .buildOrderedInjectedExpr (inScope , v )
209
212
case * ast.ParenExpr :
210
213
return b .buildScalar (inScope , v .Expr )
211
214
case * ast.AndExpr :
@@ -272,23 +275,7 @@ func (b *Builder) buildScalar(inScope *scope, e ast.Expr) (ex sql.Expression) {
272
275
}
273
276
return ret
274
277
case ast.InjectedExpr :
275
- if err := b .cat .AuthorizationHandler ().HandleAuth (b .ctx , b .authQueryState , v .Auth ); err != nil && b .authEnabled {
276
- b .handleErr (err )
277
- }
278
- resolvedChildren := make ([]any , len (v .Children ))
279
- for i , child := range v .Children {
280
- resolvedChildren [i ] = b .buildScalar (inScope , child )
281
- }
282
- expr , err := v .Expression .WithResolvedChildren (resolvedChildren )
283
- if err != nil {
284
- b .handleErr (err )
285
- return nil
286
- }
287
- if sqlExpr , ok := expr .(sql.Expression ); ok {
288
- return sqlExpr
289
- }
290
- b .handleErr (fmt .Errorf ("Injected expression does not resolve to a valid expression" ))
291
- return nil
278
+ return b .buildInjectedExpr (inScope , v )
292
279
case * ast.RangeCond :
293
280
val := b .buildScalar (inScope , v .Left )
294
281
lower := b .buildScalar (inScope , v .From )
@@ -422,6 +409,30 @@ func (b *Builder) buildScalar(inScope *scope, e ast.Expr) (ex sql.Expression) {
422
409
return nil
423
410
}
424
411
412
+ func (b * Builder ) buildInjectedExpr (inScope * scope , v ast.InjectedExpr ) sql.Expression {
413
+ if err := b .cat .AuthorizationHandler ().HandleAuth (b .ctx , b .authQueryState , v .Auth ); err != nil && b .authEnabled {
414
+ b .handleErr (err )
415
+ }
416
+ resolvedChildren := make ([]any , len (v .Children ))
417
+ for i , child := range v .Children {
418
+ resolvedChildren [i ] = b .buildScalar (inScope , child )
419
+ }
420
+ return b .buildInjectedExpressionFromResolvedChildren (v , resolvedChildren )
421
+ }
422
+
423
+ func (b * Builder ) buildInjectedExpressionFromResolvedChildren (v ast.InjectedExpr , resolvedChildren []any ) sql.Expression {
424
+ expr , err := v .Expression .WithResolvedChildren (resolvedChildren )
425
+ if err != nil {
426
+ b .handleErr (err )
427
+ return nil
428
+ }
429
+ if sqlExpr , ok := expr .(sql.Expression ); ok {
430
+ return sqlExpr
431
+ }
432
+ b .handleErr (fmt .Errorf ("injected expression should resolve to sql.Expression, got %T" , expr ))
433
+ return nil
434
+ }
435
+
425
436
func (b * Builder ) getOrigTblName (node sql.Node , alias string ) string {
426
437
if node == nil {
427
438
return ""
0 commit comments