Skip to content

Commit f755beb

Browse files
author
James Cor
committed
start sorting through bugs
1 parent b387d21 commit f755beb

File tree

3 files changed

+22
-15
lines changed

3 files changed

+22
-15
lines changed

sql/analyzer/stored_procedures.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func loadStoredProcedures(ctx *sql.Context, a *Analyzer, n sql.Node, scope *plan
5252
return nil, err
5353
}
5454
for _, procedure := range procedures {
55-
proc, _ := planbuilder.BuildProcedureHelper(ctx, a.Catalog, nil, database, nil, procedure)
55+
proc, _ := planbuilder.BuildProcedureHelper(ctx, a.Catalog, false, nil, database, nil, procedure)
5656
err = scope.Procedures.Register(database.Name(), proc)
5757
if err != nil {
5858
return nil, err

sql/planbuilder/create_ddl.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,12 @@ func (b *Builder) buildCreateProcedure(inScope *scope, subQuery string, fullQuer
213213

214214
bodyStr := strings.TrimSpace(fullQuery[c.SubStatementPositionStart:c.SubStatementPositionEnd])
215215

216+
// TODO: need to validate limit clauses for non-integers???
217+
// TODO only return some errors??? somehow
218+
BuildProcedureHelper(b.ctx, b.cat, true, inScope.push(), db, nil, spd)
219+
220+
// TODO: validate for recursion and other ddl here
221+
216222
outScope = inScope.push()
217223
outScope.node = plan.NewCreateProcedure(db, spd, bodyStr)
218224
return outScope

sql/planbuilder/proc.go

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)