From 70a452ac31b59f3589293fce43df274cf905cffd Mon Sep 17 00:00:00 2001 From: James Cor Date: Fri, 24 Jan 2025 01:06:51 -0800 Subject: [PATCH 1/3] return error for ddl in create proc statements --- enginetest/queries/procedure_queries.go | 58 +++++++++++++++++++++ sql/analyzer/stored_procedures.go | 67 +++---------------------- sql/planbuilder/create_ddl.go | 20 +++++++- sql/planbuilder/proc.go | 46 +++++++++++++++++ sql/query_flags.go | 1 + 5 files changed, 131 insertions(+), 61 deletions(-) diff --git a/enginetest/queries/procedure_queries.go b/enginetest/queries/procedure_queries.go index ae03494138..7a9f5744af 100644 --- a/enginetest/queries/procedure_queries.go +++ b/enginetest/queries/procedure_queries.go @@ -2823,6 +2823,64 @@ var ProcedureCreateInSubroutineTests = []ScriptTest{ }, }, }, + { + Name: "procedure must not contain CREATE TABLE", + Assertions: []ScriptTestAssertion{ + { + Query: "create procedure p() create table t (pk int);", + ExpectedErrStr: "creating tables in stored procedures is currently unsupported and will be added in a future release", + }, + { + Query: "create procedure p() begin create table t (pk int); end;", + ExpectedErrStr: "creating tables in stored procedures is currently unsupported and will be added in a future release", + }, + }, + }, + { + Name: "procedure must not contain CREATE TRIGGER", + SetUpScript: []string{ + "create table t (i int);", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "create procedure p() create trigger trig before insert on t for each row begin select 1; end;", + ExpectedErrStr: "creating triggers in stored procedures is currently unsupported and will be added in a future release", + }, + { + Query: "create procedure p() begin create trigger trig before insert on t for each row begin select 1; end; end;", + ExpectedErrStr: "creating triggers in stored procedures is currently unsupported and will be added in a future release", + }, + }, + }, + { + Name: "procedure must not contain CREATE DB", + SetUpScript: []string{}, + Assertions: []ScriptTestAssertion{ + { + Query: "create procedure p() create database procdb;", + ExpectedErrStr: "creating databases in stored procedures is currently unsupported and will be added in a future release", + }, + { + Query: "create procedure p() begin create database procdb; end;", + ExpectedErrStr: "creating databases in stored procedures is currently unsupported and will be added in a future release", + }, + }, + }, + { + Name: "procedure must not contain CREATE VIEW", + SetUpScript: []string{}, + Assertions: []ScriptTestAssertion{ + { + Query: "create procedure p() create view v as select 1;", + ExpectedErrStr: "creating views in stored procedures is currently unsupported and will be added in a future release", + }, + { + Query: "create procedure p() begin create view v as select 1; end;", + ExpectedErrStr: "creating views in stored procedures is currently unsupported and will be added in a future release", + }, + }, + }, + } var NoDbProcedureTests = []ScriptTestAssertion{ diff --git a/sql/analyzer/stored_procedures.go b/sql/analyzer/stored_procedures.go index 70d43f4e13..126358d078 100644 --- a/sql/analyzer/stored_procedures.go +++ b/sql/analyzer/stored_procedures.go @@ -15,17 +15,14 @@ package analyzer import ( - "fmt" - "slices" - "strings" - "gopkg.in/src-d/go-errors.v1" - - "github.com/dolthub/go-mysql-server/sql" - "github.com/dolthub/go-mysql-server/sql/expression" - "github.com/dolthub/go-mysql-server/sql/plan" - "github.com/dolthub/go-mysql-server/sql/planbuilder" - "github.com/dolthub/go-mysql-server/sql/transform" +"fmt" +"github.com/dolthub/go-mysql-server/sql" +"github.com/dolthub/go-mysql-server/sql/expression" +"github.com/dolthub/go-mysql-server/sql/plan" +"github.com/dolthub/go-mysql-server/sql/planbuilder" +"github.com/dolthub/go-mysql-server/sql/transform" +"slices" ) // loadStoredProcedures loads non-built-in stored procedures for all databases on relevant calls. @@ -184,56 +181,6 @@ func validateCreateProcedure(ctx *sql.Context, a *Analyzer, node sql.Node, scope func validateStoredProcedure(_ *sql.Context, proc *plan.Procedure) error { // For now, we don't support creating any of the following within stored procedures. // These will be removed in the future, but cause issues with the current execution plan. - var err error - spUnsupportedErr := errors.NewKind("creating %s in stored procedures is currently unsupported " + - "and will be added in a future release") - transform.Inspect(proc, func(n sql.Node) bool { - switch n.(type) { - case *plan.CreateTable: - err = spUnsupportedErr.New("tables") - case *plan.CreateTrigger: - err = spUnsupportedErr.New("triggers") - case *plan.CreateProcedure: - err = spUnsupportedErr.New("procedures") - case *plan.CreateDB: - err = spUnsupportedErr.New("databases") - case *plan.CreateForeignKey: - err = spUnsupportedErr.New("foreign keys") - case *plan.CreateIndex: - err = spUnsupportedErr.New("indexes") - case *plan.CreateView: - err = spUnsupportedErr.New("views") - default: - return true - } - return false - }) - if err != nil { - return err - } - - transform.Inspect(proc, func(n sql.Node) bool { - switch n := n.(type) { - case *plan.Call: - if proc.Name == strings.ToLower(n.Name) { - err = sql.ErrProcedureRecursiveCall.New(proc.Name) - } - case *plan.LockTables: // Blocked in vitess, but this is for safety - err = sql.ErrProcedureInvalidBodyStatement.New("LOCK TABLES") - case *plan.UnlockTables: // Blocked in vitess, but this is for safety - err = sql.ErrProcedureInvalidBodyStatement.New("UNLOCK TABLES") - case *plan.Use: // Blocked in vitess, but this is for safety - err = sql.ErrProcedureInvalidBodyStatement.New("USE") - case *plan.LoadData: - err = sql.ErrProcedureInvalidBodyStatement.New("LOAD DATA") - default: - return true - } - return false - }) - if err != nil { - return err - } return nil } diff --git a/sql/planbuilder/create_ddl.go b/sql/planbuilder/create_ddl.go index d7757f6dd9..96dddf444b 100644 --- a/sql/planbuilder/create_ddl.go +++ b/sql/planbuilder/create_ddl.go @@ -16,7 +16,8 @@ package planbuilder import ( "fmt" - "strings" + "github.com/dolthub/go-mysql-server/sql/transform" +"strings" "time" "unicode" @@ -132,6 +133,9 @@ func getCurrentUserForDefiner(ctx *sql.Context, definer string) string { } func (b *Builder) buildCreateProcedure(inScope *scope, subQuery string, fullQuery string, c *ast.DDL) (outScope *scope) { + b.qFlags.Set(sql.QFlagCreateProcedure) + defer func() {b.qFlags.Unset(sql.QFlagCreateProcedure)}() + var params []plan.ProcedureParam for _, param := range c.ProcedureSpec.Params { var direction plan.ProcedureParamDirection @@ -200,6 +204,20 @@ func (b *Builder) buildCreateProcedure(inScope *scope, subQuery string, fullQuer bodyStr := strings.TrimSpace(fullQuery[c.SubStatementPositionStart:c.SubStatementPositionEnd]) bodyScope := b.buildSubquery(inScope, c.ProcedureSpec.Body, bodyStr, fullQuery) + b.validateStoredProcedure(bodyScope.node) + + // Check for recursive calls to same procedure + transform.Inspect(bodyScope.node, func(node sql.Node) (bool) { + switch n := node.(type) { + case *plan.Call: + if strings.EqualFold(procName, n.Name) { + b.handleErr(sql.ErrProcedureRecursiveCall.New(procName)) + } + return false + default: + return true + } + }) var db sql.Database = nil dbName := c.ProcedureSpec.ProcName.Qualifier.String() diff --git a/sql/planbuilder/proc.go b/sql/planbuilder/proc.go index c8dcdbfb2c..29ae0b3412 100644 --- a/sql/planbuilder/proc.go +++ b/sql/planbuilder/proc.go @@ -16,6 +16,7 @@ package planbuilder import ( "fmt" + "gopkg.in/src-d/go-errors.v1" "strconv" "strings" @@ -24,6 +25,7 @@ import ( "github.com/dolthub/go-mysql-server/sql" "github.com/dolthub/go-mysql-server/sql/expression" "github.com/dolthub/go-mysql-server/sql/plan" + "github.com/dolthub/go-mysql-server/sql/transform" "github.com/dolthub/go-mysql-server/sql/types" ) @@ -404,11 +406,55 @@ func (b *Builder) buildBlock(inScope *scope, parserStatements ast.Statements, fu } } stmtScope := b.buildSubquery(inScope, s, ast.String(s), fullQuery) + if b.qFlags.IsSet(sql.QFlagCreateProcedure) { + b.validateStoredProcedure(stmtScope.node) + } statements = append(statements, stmtScope.node) } + return plan.NewBlock(statements) } +func (b *Builder) validateStoredProcedure(node sql.Node) { + // For now, we don't support creating any of the following within stored procedures. + // These will be removed in the future, but cause issues with the current execution plan. + var err error + spUnsupportedErr := errors.NewKind("creating %s in stored procedures is currently unsupported " + + "and will be added in a future release") + transform.Inspect(node, func(n sql.Node) bool { + switch n.(type) { + case *plan.CreateTable: + err = spUnsupportedErr.New("tables") + case *plan.CreateTrigger: + err = spUnsupportedErr.New("triggers") + case *plan.CreateProcedure: + err = spUnsupportedErr.New("procedures") + case *plan.CreateDB: + err = spUnsupportedErr.New("databases") + case *plan.CreateForeignKey: + err = spUnsupportedErr.New("foreign keys") + case *plan.CreateIndex: + err = spUnsupportedErr.New("indexes") + case *plan.CreateView: + err = spUnsupportedErr.New("views") + case *plan.LockTables: // Blocked in vitess, but this is for safety + err = sql.ErrProcedureInvalidBodyStatement.New("LOCK TABLES") + case *plan.UnlockTables: // Blocked in vitess, but this is for safety + err = sql.ErrProcedureInvalidBodyStatement.New("UNLOCK TABLES") + case *plan.Use: // Blocked in vitess, but this is for safety + err = sql.ErrProcedureInvalidBodyStatement.New("USE") + case *plan.LoadData: + err = sql.ErrProcedureInvalidBodyStatement.New("LOAD DATA") + default: + return true + } + return false + }) + if err != nil { + b.handleErr(err) + } +} + func (b *Builder) buildFetchCursor(inScope *scope, fetchCursor *ast.FetchCursor) (outScope *scope) { if !inScope.proc.HasCursor(fetchCursor.Name) { err := sql.ErrCursorNotFound.New(fetchCursor.Name) diff --git a/sql/query_flags.go b/sql/query_flags.go index 3e5f360f98..cce6156abc 100644 --- a/sql/query_flags.go +++ b/sql/query_flags.go @@ -51,6 +51,7 @@ const ( // QFlagUndeferrableExprs indicates that the query has expressions that cannot be deferred QFlagUndeferrableExprs QFlagTrigger + QFlagCreateProcedure ) type QueryFlags struct { From aeb7cd581d2fc32833a820b919c160448313c86e Mon Sep 17 00:00:00 2001 From: jycor Date: Fri, 24 Jan 2025 09:30:15 +0000 Subject: [PATCH 2/3] [ga-format-pr] Run ./format_repo.sh to fix formatting --- enginetest/queries/procedure_queries.go | 21 ++++++++++----------- sql/analyzer/stored_procedures.go | 16 ++++++++-------- sql/planbuilder/create_ddl.go | 8 ++++---- sql/planbuilder/proc.go | 2 +- 4 files changed, 23 insertions(+), 24 deletions(-) diff --git a/enginetest/queries/procedure_queries.go b/enginetest/queries/procedure_queries.go index 7a9f5744af..1e41686fe1 100644 --- a/enginetest/queries/procedure_queries.go +++ b/enginetest/queries/procedure_queries.go @@ -2827,11 +2827,11 @@ var ProcedureCreateInSubroutineTests = []ScriptTest{ Name: "procedure must not contain CREATE TABLE", Assertions: []ScriptTestAssertion{ { - Query: "create procedure p() create table t (pk int);", + Query: "create procedure p() create table t (pk int);", ExpectedErrStr: "creating tables in stored procedures is currently unsupported and will be added in a future release", }, { - Query: "create procedure p() begin create table t (pk int); end;", + Query: "create procedure p() begin create table t (pk int); end;", ExpectedErrStr: "creating tables in stored procedures is currently unsupported and will be added in a future release", }, }, @@ -2843,44 +2843,43 @@ var ProcedureCreateInSubroutineTests = []ScriptTest{ }, Assertions: []ScriptTestAssertion{ { - Query: "create procedure p() create trigger trig before insert on t for each row begin select 1; end;", + Query: "create procedure p() create trigger trig before insert on t for each row begin select 1; end;", ExpectedErrStr: "creating triggers in stored procedures is currently unsupported and will be added in a future release", }, { - Query: "create procedure p() begin create trigger trig before insert on t for each row begin select 1; end; end;", + Query: "create procedure p() begin create trigger trig before insert on t for each row begin select 1; end; end;", ExpectedErrStr: "creating triggers in stored procedures is currently unsupported and will be added in a future release", }, }, }, { - Name: "procedure must not contain CREATE DB", + Name: "procedure must not contain CREATE DB", SetUpScript: []string{}, Assertions: []ScriptTestAssertion{ { - Query: "create procedure p() create database procdb;", + Query: "create procedure p() create database procdb;", ExpectedErrStr: "creating databases in stored procedures is currently unsupported and will be added in a future release", }, { - Query: "create procedure p() begin create database procdb; end;", + Query: "create procedure p() begin create database procdb; end;", ExpectedErrStr: "creating databases in stored procedures is currently unsupported and will be added in a future release", }, }, }, { - Name: "procedure must not contain CREATE VIEW", + Name: "procedure must not contain CREATE VIEW", SetUpScript: []string{}, Assertions: []ScriptTestAssertion{ { - Query: "create procedure p() create view v as select 1;", + Query: "create procedure p() create view v as select 1;", ExpectedErrStr: "creating views in stored procedures is currently unsupported and will be added in a future release", }, { - Query: "create procedure p() begin create view v as select 1; end;", + Query: "create procedure p() begin create view v as select 1; end;", ExpectedErrStr: "creating views in stored procedures is currently unsupported and will be added in a future release", }, }, }, - } var NoDbProcedureTests = []ScriptTestAssertion{ diff --git a/sql/analyzer/stored_procedures.go b/sql/analyzer/stored_procedures.go index 126358d078..2b9e32d1f8 100644 --- a/sql/analyzer/stored_procedures.go +++ b/sql/analyzer/stored_procedures.go @@ -15,14 +15,14 @@ package analyzer import ( - -"fmt" -"github.com/dolthub/go-mysql-server/sql" -"github.com/dolthub/go-mysql-server/sql/expression" -"github.com/dolthub/go-mysql-server/sql/plan" -"github.com/dolthub/go-mysql-server/sql/planbuilder" -"github.com/dolthub/go-mysql-server/sql/transform" -"slices" + "fmt" + "slices" + + "github.com/dolthub/go-mysql-server/sql" + "github.com/dolthub/go-mysql-server/sql/expression" + "github.com/dolthub/go-mysql-server/sql/plan" + "github.com/dolthub/go-mysql-server/sql/planbuilder" + "github.com/dolthub/go-mysql-server/sql/transform" ) // loadStoredProcedures loads non-built-in stored procedures for all databases on relevant calls. diff --git a/sql/planbuilder/create_ddl.go b/sql/planbuilder/create_ddl.go index 96dddf444b..47a1f5ae13 100644 --- a/sql/planbuilder/create_ddl.go +++ b/sql/planbuilder/create_ddl.go @@ -16,8 +16,7 @@ package planbuilder import ( "fmt" - "github.com/dolthub/go-mysql-server/sql/transform" -"strings" + "strings" "time" "unicode" @@ -26,6 +25,7 @@ import ( "github.com/dolthub/go-mysql-server/sql" "github.com/dolthub/go-mysql-server/sql/expression" "github.com/dolthub/go-mysql-server/sql/plan" + "github.com/dolthub/go-mysql-server/sql/transform" "github.com/dolthub/go-mysql-server/sql/types" ) @@ -134,7 +134,7 @@ func getCurrentUserForDefiner(ctx *sql.Context, definer string) string { func (b *Builder) buildCreateProcedure(inScope *scope, subQuery string, fullQuery string, c *ast.DDL) (outScope *scope) { b.qFlags.Set(sql.QFlagCreateProcedure) - defer func() {b.qFlags.Unset(sql.QFlagCreateProcedure)}() + defer func() { b.qFlags.Unset(sql.QFlagCreateProcedure) }() var params []plan.ProcedureParam for _, param := range c.ProcedureSpec.Params { @@ -207,7 +207,7 @@ func (b *Builder) buildCreateProcedure(inScope *scope, subQuery string, fullQuer b.validateStoredProcedure(bodyScope.node) // Check for recursive calls to same procedure - transform.Inspect(bodyScope.node, func(node sql.Node) (bool) { + transform.Inspect(bodyScope.node, func(node sql.Node) bool { switch n := node.(type) { case *plan.Call: if strings.EqualFold(procName, n.Name) { diff --git a/sql/planbuilder/proc.go b/sql/planbuilder/proc.go index 29ae0b3412..56ccda45d1 100644 --- a/sql/planbuilder/proc.go +++ b/sql/planbuilder/proc.go @@ -16,11 +16,11 @@ package planbuilder import ( "fmt" - "gopkg.in/src-d/go-errors.v1" "strconv" "strings" ast "github.com/dolthub/vitess/go/vt/sqlparser" + "gopkg.in/src-d/go-errors.v1" "github.com/dolthub/go-mysql-server/sql" "github.com/dolthub/go-mysql-server/sql/expression" From 15a94bdb4d26da0ceec8888faead7b72738b1b18 Mon Sep 17 00:00:00 2001 From: James Cor Date: Fri, 24 Jan 2025 02:34:17 -0800 Subject: [PATCH 3/3] remove useless rule --- sql/analyzer/rule_ids.go | 1 - sql/analyzer/ruleid_string.go | 113 +++++++++++++++--------------- sql/analyzer/rules.go | 1 - sql/analyzer/stored_procedures.go | 29 +------- 4 files changed, 57 insertions(+), 87 deletions(-) diff --git a/sql/analyzer/rule_ids.go b/sql/analyzer/rule_ids.go index 7ff2e8a848..3bd50f04d0 100644 --- a/sql/analyzer/rule_ids.go +++ b/sql/analyzer/rule_ids.go @@ -21,7 +21,6 @@ const ( resolveUnionsId // resolveUnions ValidateColumnDefaultsId // validateColumnDefaults validateCreateTriggerId // validateCreateTrigger - validateCreateProcedureId // validateCreateProcedure validateReadOnlyDatabaseId // validateReadOnlyDatabase validateReadOnlyTransactionId // validateReadOnlyTransaction validateDatabaseSetId // validateDatabaseSet diff --git a/sql/analyzer/ruleid_string.go b/sql/analyzer/ruleid_string.go index d334ecce2d..ad687ce11e 100755 --- a/sql/analyzer/ruleid_string.go +++ b/sql/analyzer/ruleid_string.go @@ -23,66 +23,65 @@ func _() { _ = x[resolveUnionsId-12] _ = x[ValidateColumnDefaultsId-13] _ = x[validateCreateTriggerId-14] - _ = x[validateCreateProcedureId-15] - _ = x[validateReadOnlyDatabaseId-16] - _ = x[validateReadOnlyTransactionId-17] - _ = x[validateDatabaseSetId-18] - _ = x[validatePrivilegesId-19] - _ = x[flattenTableAliasesId-20] - _ = x[pushdownSubqueryAliasFiltersId-21] - _ = x[validateCheckConstraintId-22] - _ = x[replaceCountStarId-23] - _ = x[replaceCrossJoinsId-24] - _ = x[moveJoinCondsToFilterId-25] - _ = x[simplifyFiltersId-26] - _ = x[pushNotFiltersId-27] - _ = x[hoistOutOfScopeFiltersId-28] - _ = x[unnestInSubqueriesId-29] - _ = x[unnestExistsSubqueriesId-30] - _ = x[finalizeSubqueriesId-31] - _ = x[finalizeUnionsId-32] - _ = x[loadTriggersId-33] - _ = x[processTruncateId-34] - _ = x[resolveAlterColumnId-35] - _ = x[stripTableNameInDefaultsId-36] - _ = x[optimizeJoinsId-37] - _ = x[pushFiltersId-38] - _ = x[applyIndexesFromOuterScopeId-39] - _ = x[pruneTablesId-40] - _ = x[assignExecIndexesId-41] - _ = x[inlineSubqueryAliasRefsId-42] - _ = x[eraseProjectionId-43] - _ = x[flattenDistinctId-44] - _ = x[replaceAggId-45] - _ = x[replaceIdxSortId-46] - _ = x[insertTopNId-47] - _ = x[replaceIdxOrderByDistanceId-48] - _ = x[applyHashInId-49] - _ = x[resolveInsertRowsId-50] - _ = x[applyTriggersId-51] - _ = x[applyProceduresId-52] - _ = x[assignRoutinesId-53] - _ = x[modifyUpdateExprsForJoinId-54] - _ = x[applyForeignKeysId-55] - _ = x[validateResolvedId-56] - _ = x[validateOrderById-57] - _ = x[validateGroupById-58] - _ = x[validateSchemaSourceId-59] - _ = x[validateIndexCreationId-60] - _ = x[ValidateOperandsId-61] - _ = x[validateIntervalUsageId-62] - _ = x[validateSubqueryColumnsId-63] - _ = x[validateUnionSchemasMatchId-64] - _ = x[validateAggregationsId-65] - _ = x[validateDeleteFromId-66] - _ = x[cacheSubqueryAliasesInJoinsId-67] - _ = x[BacktickDefaulColumnValueNamesId-68] - _ = x[TrackProcessId-69] + _ = x[validateReadOnlyDatabaseId-15] + _ = x[validateReadOnlyTransactionId-16] + _ = x[validateDatabaseSetId-17] + _ = x[validatePrivilegesId-18] + _ = x[flattenTableAliasesId-19] + _ = x[pushdownSubqueryAliasFiltersId-20] + _ = x[validateCheckConstraintId-21] + _ = x[replaceCountStarId-22] + _ = x[replaceCrossJoinsId-23] + _ = x[moveJoinCondsToFilterId-24] + _ = x[simplifyFiltersId-25] + _ = x[pushNotFiltersId-26] + _ = x[hoistOutOfScopeFiltersId-27] + _ = x[unnestInSubqueriesId-28] + _ = x[unnestExistsSubqueriesId-29] + _ = x[finalizeSubqueriesId-30] + _ = x[finalizeUnionsId-31] + _ = x[loadTriggersId-32] + _ = x[processTruncateId-33] + _ = x[resolveAlterColumnId-34] + _ = x[stripTableNameInDefaultsId-35] + _ = x[optimizeJoinsId-36] + _ = x[pushFiltersId-37] + _ = x[applyIndexesFromOuterScopeId-38] + _ = x[pruneTablesId-39] + _ = x[assignExecIndexesId-40] + _ = x[inlineSubqueryAliasRefsId-41] + _ = x[eraseProjectionId-42] + _ = x[flattenDistinctId-43] + _ = x[replaceAggId-44] + _ = x[replaceIdxSortId-45] + _ = x[insertTopNId-46] + _ = x[replaceIdxOrderByDistanceId-47] + _ = x[applyHashInId-48] + _ = x[resolveInsertRowsId-49] + _ = x[applyTriggersId-50] + _ = x[applyProceduresId-51] + _ = x[assignRoutinesId-52] + _ = x[modifyUpdateExprsForJoinId-53] + _ = x[applyForeignKeysId-54] + _ = x[validateResolvedId-55] + _ = x[validateOrderById-56] + _ = x[validateGroupById-57] + _ = x[validateSchemaSourceId-58] + _ = x[validateIndexCreationId-59] + _ = x[ValidateOperandsId-60] + _ = x[validateIntervalUsageId-61] + _ = x[validateSubqueryColumnsId-62] + _ = x[validateUnionSchemasMatchId-63] + _ = x[validateAggregationsId-64] + _ = x[validateDeleteFromId-65] + _ = x[cacheSubqueryAliasesInJoinsId-66] + _ = x[BacktickDefaulColumnValueNamesId-67] + _ = x[TrackProcessId-68] } -const _RuleId_name = "applyDefaultSelectLimitvalidateOffsetAndLimitvalidateStarExpressionsvalidateCreateTablevalidateAlterTablevalidateExprSemloadStoredProceduresvalidateDropTablesresolveDropConstraintvalidateDropConstraintresolveCreateSelectresolveSubqueriesresolveUnionsvalidateColumnDefaultsvalidateCreateTriggervalidateCreateProcedurevalidateReadOnlyDatabasevalidateReadOnlyTransactionvalidateDatabaseSetvalidatePrivilegesflattenTableAliasespushdownSubqueryAliasFiltersvalidateCheckConstraintsreplaceCountStarreplaceCrossJoinsmoveJoinConditionsToFiltersimplifyFilterspushNotFiltershoistOutOfScopeFiltersunnestInSubqueriesunnestExistsSubqueriesfinalizeSubqueriesfinalizeUnionsloadTriggersprocessTruncateresolveAlterColumnstripTableNamesFromColumnDefaultsoptimizeJoinspushFiltersapplyIndexesFromOuterScopepruneTablesassignExecIndexesinlineSubqueryAliasRefseraseProjectionflattenDistinctreplaceAggreplaceIdxSortinsertTopNNodesreplaceIdxOrderByDistanceapplyHashInresolveInsertRowsapplyTriggersapplyProceduresassignRoutinesmodifyUpdateExprsForJoinapplyForeignKeysvalidateResolvedvalidateOrderByvalidateGroupByvalidateSchemaSourcevalidateIndexCreationvalidateOperandsvalidateIntervalUsagevalidateSubqueryColumnsvalidateUnionSchemasMatchvalidateAggregationsvalidateDeleteFromcacheSubqueryAliasesInJoinsbacktickDefaultColumnValueNamestrackProcess" +const _RuleId_name = "applyDefaultSelectLimitvalidateOffsetAndLimitvalidateStarExpressionsvalidateCreateTablevalidateAlterTablevalidateExprSemloadStoredProceduresvalidateDropTablesresolveDropConstraintvalidateDropConstraintresolveCreateSelectresolveSubqueriesresolveUnionsvalidateColumnDefaultsvalidateCreateTriggervalidateReadOnlyDatabasevalidateReadOnlyTransactionvalidateDatabaseSetvalidatePrivilegesflattenTableAliasespushdownSubqueryAliasFiltersvalidateCheckConstraintsreplaceCountStarreplaceCrossJoinsmoveJoinConditionsToFiltersimplifyFilterspushNotFiltershoistOutOfScopeFiltersunnestInSubqueriesunnestExistsSubqueriesfinalizeSubqueriesfinalizeUnionsloadTriggersprocessTruncateresolveAlterColumnstripTableNamesFromColumnDefaultsoptimizeJoinspushFiltersapplyIndexesFromOuterScopepruneTablesassignExecIndexesinlineSubqueryAliasRefseraseProjectionflattenDistinctreplaceAggreplaceIdxSortinsertTopNNodesreplaceIdxOrderByDistanceapplyHashInresolveInsertRowsapplyTriggersapplyProceduresassignRoutinesmodifyUpdateExprsForJoinapplyForeignKeysvalidateResolvedvalidateOrderByvalidateGroupByvalidateSchemaSourcevalidateIndexCreationvalidateOperandsvalidateIntervalUsagevalidateSubqueryColumnsvalidateUnionSchemasMatchvalidateAggregationsvalidateDeleteFromcacheSubqueryAliasesInJoinsbacktickDefaultColumnValueNamestrackProcess" -var _RuleId_index = [...]uint16{0, 23, 45, 68, 87, 105, 120, 140, 158, 179, 201, 220, 237, 250, 272, 293, 316, 340, 367, 386, 404, 423, 451, 475, 491, 508, 534, 549, 563, 585, 603, 625, 643, 657, 669, 684, 702, 735, 748, 759, 785, 796, 813, 836, 851, 866, 876, 890, 905, 930, 941, 958, 971, 986, 1000, 1024, 1040, 1056, 1071, 1086, 1106, 1127, 1143, 1164, 1187, 1212, 1232, 1250, 1277, 1308, 1320} +var _RuleId_index = [...]uint16{0, 23, 45, 68, 87, 105, 120, 140, 158, 179, 201, 220, 237, 250, 272, 293, 317, 344, 363, 381, 400, 428, 452, 468, 485, 511, 526, 540, 562, 580, 602, 620, 634, 646, 661, 679, 712, 725, 736, 762, 773, 790, 813, 828, 843, 853, 867, 882, 907, 918, 935, 948, 963, 977, 1001, 1017, 1033, 1048, 1063, 1083, 1104, 1120, 1141, 1164, 1189, 1209, 1227, 1254, 1285, 1297} func (i RuleId) String() string { if i < 0 || i >= RuleId(len(_RuleId_index)-1) { diff --git a/sql/analyzer/rules.go b/sql/analyzer/rules.go index f4b4c7e5bc..33378e0602 100644 --- a/sql/analyzer/rules.go +++ b/sql/analyzer/rules.go @@ -37,7 +37,6 @@ var OnceBeforeDefault = []Rule{ {validateCreateTableId, validateCreateTable}, {validateAlterTableId, validateAlterTable}, {validateExprSemId, validateExprSem}, - {validateCreateProcedureId, validateCreateProcedure}, {resolveDropConstraintId, resolveDropConstraint}, {resolveAlterColumnId, resolveAlterColumn}, {validateDropTablesId, validateDropTables}, diff --git a/sql/analyzer/stored_procedures.go b/sql/analyzer/stored_procedures.go index 2b9e32d1f8..c78d9759e1 100644 --- a/sql/analyzer/stored_procedures.go +++ b/sql/analyzer/stored_procedures.go @@ -81,11 +81,8 @@ func loadStoredProcedures(ctx *sql.Context, a *Analyzer, n sql.Node, scope *plan // analyzeCreateProcedure checks the plan.CreateProcedure and returns a valid plan.Procedure or an error func analyzeCreateProcedure(ctx *sql.Context, a *Analyzer, cp *plan.CreateProcedure, scope *plan.Scope, sel RuleSelector, qFlags *sql.QueryFlags) (*plan.Procedure, error) { - err := validateStoredProcedure(ctx, cp.Procedure) - if err != nil { - return nil, err - } var analyzedNode sql.Node + var err error analyzedNode, _, err = analyzeProcedureBodies(ctx, a, cp.Procedure, false, scope, sel, qFlags) if err != nil { return nil, err @@ -161,30 +158,6 @@ func analyzeProcedureBodies(ctx *sql.Context, a *Analyzer, node sql.Node, skipCa return node, transform.NewTree, nil } -// validateCreateProcedure handles CreateProcedure nodes, ensuring that all nodes in Procedure are supported. -func validateCreateProcedure(ctx *sql.Context, a *Analyzer, node sql.Node, scope *plan.Scope, sel RuleSelector, qFlags *sql.QueryFlags) (sql.Node, transform.TreeIdentity, error) { - cp, ok := node.(*plan.CreateProcedure) - if !ok { - return node, transform.SameTree, nil - } - - err := validateStoredProcedure(ctx, cp.Procedure) - if err != nil { - return nil, transform.SameTree, err - } - - return node, transform.SameTree, nil -} - -// validateStoredProcedure handles Procedure nodes, resolving references to the parameters, along with ensuring -// that all logic contained within the stored procedure body is valid. -func validateStoredProcedure(_ *sql.Context, proc *plan.Procedure) error { - // For now, we don't support creating any of the following within stored procedures. - // These will be removed in the future, but cause issues with the current execution plan. - - return nil -} - // applyProcedures applies the relevant stored procedures to the node given (if necessary). func applyProcedures(ctx *sql.Context, a *Analyzer, n sql.Node, scope *plan.Scope, sel RuleSelector, qFlags *sql.QueryFlags) (sql.Node, transform.TreeIdentity, error) { if _, ok := n.(*plan.CreateProcedure); ok {