Skip to content

Commit 65a75e2

Browse files
author
James Cor
committed
fixed external stored procedures, moving onto other procedure errors
1 parent ba620f8 commit 65a75e2

File tree

4 files changed

+34
-20
lines changed

4 files changed

+34
-20
lines changed

enginetest/queries/procedure_queries.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2441,6 +2441,20 @@ var ProcedureCallTests = []ScriptTest{
24412441
},
24422442
},
24432443
},
2444+
{
2445+
Name: "creating invalid procedure doesn't error until it is called",
2446+
Assertions: []ScriptTestAssertion{
2447+
{
2448+
Query: `CREATE PROCEDURE proc1 (OUT out_count INT) READS SQL DATA SELECT COUNT(*) FROM mytable WHERE i = 1 AND s = 'first row' AND func1(i);`,
2449+
Expected: []sql.Row{{types.NewOkResult(0)}},
2450+
},
2451+
{
2452+
Query: "CALL proc1(@out_count);",
2453+
ExpectedErr: sql.ErrFunctionNotFound,
2454+
},
2455+
},
2456+
2457+
},
24442458
}
24452459

24462460
var ProcedureDropTests = []ScriptTest{

enginetest/queries/queries.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10956,11 +10956,6 @@ var ErrorQueries = []QueryErrorTest{
1095610956
Query: `SELECT * FROM datetime_table where datetime_col >= 'not a valid datetime'`,
1095710957
ExpectedErr: types.ErrConvertingToTime,
1095810958
},
10959-
// this query was panicing, but should be allowed and should return error when this query is called
10960-
{
10961-
Query: `CREATE PROCEDURE proc1 (OUT out_count INT) READS SQL DATA SELECT COUNT(*) FROM mytable WHERE i = 1 AND s = 'first row' AND func1(i);`,
10962-
ExpectedErr: sql.ErrFunctionNotFound,
10963-
},
1096410959
{
1096510960
Query: "CREATE TABLE table_test (id int PRIMARY KEY, c float DEFAULT rand())",
1096610961
ExpectedErr: sql.ErrSyntaxError,

sql/analyzer/stored_procedures.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727

2828
// loadStoredProcedures loads non-built-in stored procedures for all databases on relevant calls.
2929
func loadStoredProcedures(ctx *sql.Context, a *Analyzer, n sql.Node, scope *plan.Scope, sel RuleSelector) (*plan.Scope, error) {
30+
// TODO: possible that we can just delete this entire rule
3031
if scope.ProceduresPopulating() {
3132
return scope, nil
3233
}
@@ -51,7 +52,7 @@ func loadStoredProcedures(ctx *sql.Context, a *Analyzer, n sql.Node, scope *plan
5152
return nil, err
5253
}
5354
for _, procedure := range procedures {
54-
proc := planbuilder.BuildProcedureHelper(ctx, a.Catalog, database, nil, procedure)
55+
proc := planbuilder.BuildProcedureHelper(ctx, a.Catalog, nil, database, nil, procedure)
5556
err = scope.Procedures.Register(database.Name(), proc)
5657
if err != nil {
5758
return nil, err

sql/planbuilder/proc.go

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

Comments
 (0)