@@ -226,11 +226,11 @@ func (b *Builder) buildIfConditional(inScope *scope, n ast.IfStatementCondition,
226226 return outScope
227227}
228228
229- func BuildProcedureHelper (ctx * sql.Context , cat sql.Catalog , inScope * scope , db sql.Database , asOf sql.Expression , proc sql.StoredProcedureDetails ) (* plan.Procedure , * sql.QueryFlags ) {
229+ func BuildProcedureHelper (ctx * sql.Context , cat sql.Catalog , isCreateProc bool , inScope * scope , db sql.Database , asOf sql.Expression , procDetails sql.StoredProcedureDetails ) (* plan.Procedure , * sql.QueryFlags ) {
230230 // TODO: new builder necessary?
231231 b := New (ctx , cat , nil , nil )
232232 b .DisableAuth ()
233- b .SetParserOptions (sql .NewSqlModeFromString (proc .SqlMode ).ParserOptions ())
233+ b .SetParserOptions (sql .NewSqlModeFromString (procDetails .SqlMode ).ParserOptions ())
234234 if asOf != nil {
235235 asOf , err := asOf .Eval (b .ctx , nil )
236236 if err != nil {
@@ -239,7 +239,11 @@ func BuildProcedureHelper(ctx *sql.Context, cat sql.Catalog, inScope *scope, db
239239 b .ProcCtx ().AsOf = asOf
240240 }
241241 b .ProcCtx ().DbName = db .Name ()
242- stmt , _ , _ , _ := b .parser .ParseWithOptions (b .ctx , proc .CreateStatement , ';' , false , b .parserOpts )
242+ if isCreateProc {
243+ // TODO: we want to skip certain validations for CREATE PROCEDURE
244+ b .qFlags .Set (sql .QFlagCreateProcedure )
245+ }
246+ stmt , _ , _ , _ := b .parser .ParseWithOptions (b .ctx , procDetails .CreateStatement , ';' , false , b .parserOpts )
243247 procStmt := stmt .(* ast.DDL )
244248
245249 procParams := b .buildProcedureParams (procStmt .ProcedureSpec .Params )
@@ -256,22 +260,22 @@ func BuildProcedureHelper(ctx *sql.Context, cat sql.Catalog, inScope *scope, db
256260 inScope .proc .AddVar (expression .NewProcedureParam (strings .ToLower (p .Name ), p .Type ))
257261 }
258262
259- bodyStr := strings .TrimSpace (proc .CreateStatement [procStmt .SubStatementPositionStart :procStmt .SubStatementPositionEnd ])
260- bodyScope := b .buildSubquery (inScope , procStmt .ProcedureSpec .Body , bodyStr , proc .CreateStatement )
263+ bodyStr := strings .TrimSpace (procDetails .CreateStatement [procStmt .SubStatementPositionStart :procStmt .SubStatementPositionEnd ])
264+ bodyScope := b .buildSubquery (inScope , procStmt .ProcedureSpec .Body , bodyStr , procDetails .CreateStatement )
261265
262- // TODO: validate
266+ // TODO: validate?
263267
264268 return plan .NewProcedure (
265- proc .Name ,
269+ procDetails .Name ,
266270 procStmt .ProcedureSpec .Definer ,
267271 procParams ,
268272 securityType ,
269273 comment ,
270274 characteristics ,
271- proc .CreateStatement ,
275+ procDetails .CreateStatement ,
272276 bodyScope .node ,
273- proc .CreatedAt ,
274- proc .ModifiedAt ,
277+ procDetails .CreatedAt ,
278+ procDetails .ModifiedAt ,
275279 ), b .qFlags
276280}
277281
@@ -316,7 +320,7 @@ func (b *Builder) buildCall(inScope *scope, c *ast.Call) (outScope *scope) {
316320 procDetails , ok , err = spdb .GetStoredProcedure (b .ctx , procName )
317321 if err == nil {
318322 if ok {
319- proc , innerQFlags = BuildProcedureHelper (b .ctx , b .cat , inScope , db , asOf , procDetails )
323+ proc , innerQFlags = BuildProcedureHelper (b .ctx , b .cat , false , inScope , db , asOf , procDetails )
320324 // TODO: somewhat hacky way of preserving this flag
321325 // This is necessary so that the resolveSubqueries analyzer rule
322326 // will apply NodeExecBuilder to Subqueries in procedure body
@@ -485,9 +489,6 @@ func (b *Builder) buildBlock(inScope *scope, parserStatements ast.Statements, fu
485489 }
486490 }
487491 stmtScope := b .buildSubquery (inScope , s , ast .String (s ), fullQuery )
488- if b .qFlags .IsSet (sql .QFlagCreateProcedure ) {
489- b .validateStoredProcedure (stmtScope .node )
490- }
491492 statements = append (statements , stmtScope .node )
492493 }
493494
0 commit comments