@@ -226,7 +226,7 @@ func (b *Builder) buildIfConditional(inScope *scope, n ast.IfStatementCondition,
226226 return outScope
227227}
228228
229- func BuildProcedureHelper (ctx * sql.Context , cat sql.Catalog , db sql.Database , asOf sql.Expression , proc sql.StoredProcedureDetails ) * plan.Procedure {
229+ func BuildProcedureHelper (ctx * sql.Context , cat sql.Catalog , inScope * scope , db sql.Database , asOf sql.Expression , proc sql.StoredProcedureDetails ) * plan.Procedure {
230230 // TODO: new builder necessary?
231231 b := New (ctx , cat , nil , nil )
232232 b .DisableAuth ()
@@ -241,14 +241,26 @@ func BuildProcedureHelper(ctx *sql.Context, cat sql.Catalog, db sql.Database, as
241241 b .ProcCtx ().DbName = db .Name ()
242242 stmt , _ , _ , _ := b .parser .ParseWithOptions (b .ctx , proc .CreateStatement , ';' , false , b .parserOpts )
243243 procStmt := stmt .(* ast.DDL )
244- bodyStr := strings .TrimSpace (proc .CreateStatement [procStmt .SubStatementPositionStart :procStmt .SubStatementPositionEnd ])
245- bodyScope := b .buildSubquery (nil , procStmt .ProcedureSpec .Body , bodyStr , proc .CreateStatement ) // TODO: scope?
246-
247- // TODO: validate
248244
249245 procParams := b .buildProcedureParams (procStmt .ProcedureSpec .Params )
250246 characteristics , securityType , comment := b .buildProcedureCharacteristics (procStmt .ProcedureSpec .Characteristics )
251247
248+ // populate inScope with the procedure parameters. this will be
249+ // subject maybe a bug where an inner procedure has access to
250+ // outer procedure parameters.
251+ if inScope == nil {
252+ inScope = b .newScope ()
253+ }
254+ inScope .initProc ()
255+ for _ , p := range procParams {
256+ inScope .proc .AddVar (expression .NewProcedureParam (strings .ToLower (p .Name ), p .Type ))
257+ }
258+
259+ bodyStr := strings .TrimSpace (proc .CreateStatement [procStmt .SubStatementPositionStart :procStmt .SubStatementPositionEnd ])
260+ bodyScope := b .buildSubquery (inScope , procStmt .ProcedureSpec .Body , bodyStr , proc .CreateStatement )
261+
262+ // TODO: validate
263+
252264 return plan .NewProcedure (
253265 proc .Name ,
254266 procStmt .ProcedureSpec .Definer ,
@@ -303,7 +315,7 @@ func (b *Builder) buildCall(inScope *scope, c *ast.Call) (outScope *scope) {
303315 procDetails , ok , err = spdb .GetStoredProcedure (b .ctx , procName )
304316 if err == nil {
305317 if ok {
306- proc = BuildProcedureHelper (b .ctx , b .cat , db , asOf , procDetails )
318+ proc = BuildProcedureHelper (b .ctx , b .cat , inScope , db , asOf , procDetails )
307319 } else {
308320 err = sql .ErrStoredProcedureDoesNotExist .New (procName )
309321 }
@@ -315,14 +327,6 @@ func (b *Builder) buildCall(inScope *scope, c *ast.Call) (outScope *scope) {
315327 b .handleErr (err )
316328 }
317329
318- // populate inScope with the procedure parameters. this will be
319- // subject maybe a bug where an inner procedure has access to
320- // outer procedure parameters.
321- inScope .initProc ()
322- for _ , p := range proc .Params {
323- inScope .proc .AddVar (expression .NewProcedureParam (strings .ToLower (p .Name ), p .Type ))
324- }
325-
326330 params := make ([]sql.Expression , len (c .Params ))
327331 for i , param := range c .Params {
328332 expr := b .buildScalar (inScope , param )
0 commit comments