@@ -17,9 +17,6 @@ package analyzer
1717import (
1818 "fmt"
1919 "slices"
20- "strings"
21-
22- "gopkg.in/src-d/go-errors.v1"
2320
2421 "github.com/dolthub/go-mysql-server/sql"
2522 "github.com/dolthub/go-mysql-server/sql/expression"
@@ -84,11 +81,8 @@ func loadStoredProcedures(ctx *sql.Context, a *Analyzer, n sql.Node, scope *plan
8481
8582// analyzeCreateProcedure checks the plan.CreateProcedure and returns a valid plan.Procedure or an error
8683func analyzeCreateProcedure (ctx * sql.Context , a * Analyzer , cp * plan.CreateProcedure , scope * plan.Scope , sel RuleSelector , qFlags * sql.QueryFlags ) (* plan.Procedure , error ) {
87- err := validateStoredProcedure (ctx , cp .Procedure )
88- if err != nil {
89- return nil , err
90- }
9184 var analyzedNode sql.Node
85+ var err error
9286 analyzedNode , _ , err = analyzeProcedureBodies (ctx , a , cp .Procedure , false , scope , sel , qFlags )
9387 if err != nil {
9488 return nil , err
@@ -164,80 +158,6 @@ func analyzeProcedureBodies(ctx *sql.Context, a *Analyzer, node sql.Node, skipCa
164158 return node , transform .NewTree , nil
165159}
166160
167- // validateCreateProcedure handles CreateProcedure nodes, ensuring that all nodes in Procedure are supported.
168- func validateCreateProcedure (ctx * sql.Context , a * Analyzer , node sql.Node , scope * plan.Scope , sel RuleSelector , qFlags * sql.QueryFlags ) (sql.Node , transform.TreeIdentity , error ) {
169- cp , ok := node .(* plan.CreateProcedure )
170- if ! ok {
171- return node , transform .SameTree , nil
172- }
173-
174- err := validateStoredProcedure (ctx , cp .Procedure )
175- if err != nil {
176- return nil , transform .SameTree , err
177- }
178-
179- return node , transform .SameTree , nil
180- }
181-
182- // validateStoredProcedure handles Procedure nodes, resolving references to the parameters, along with ensuring
183- // that all logic contained within the stored procedure body is valid.
184- func validateStoredProcedure (_ * sql.Context , proc * plan.Procedure ) error {
185- // For now, we don't support creating any of the following within stored procedures.
186- // These will be removed in the future, but cause issues with the current execution plan.
187- var err error
188- spUnsupportedErr := errors .NewKind ("creating %s in stored procedures is currently unsupported " +
189- "and will be added in a future release" )
190- transform .Inspect (proc , func (n sql.Node ) bool {
191- switch n .(type ) {
192- case * plan.CreateTable :
193- err = spUnsupportedErr .New ("tables" )
194- case * plan.CreateTrigger :
195- err = spUnsupportedErr .New ("triggers" )
196- case * plan.CreateProcedure :
197- err = spUnsupportedErr .New ("procedures" )
198- case * plan.CreateDB :
199- err = spUnsupportedErr .New ("databases" )
200- case * plan.CreateForeignKey :
201- err = spUnsupportedErr .New ("foreign keys" )
202- case * plan.CreateIndex :
203- err = spUnsupportedErr .New ("indexes" )
204- case * plan.CreateView :
205- err = spUnsupportedErr .New ("views" )
206- default :
207- return true
208- }
209- return false
210- })
211- if err != nil {
212- return err
213- }
214-
215- transform .Inspect (proc , func (n sql.Node ) bool {
216- switch n := n .(type ) {
217- case * plan.Call :
218- if proc .Name == strings .ToLower (n .Name ) {
219- err = sql .ErrProcedureRecursiveCall .New (proc .Name )
220- }
221- case * plan.LockTables : // Blocked in vitess, but this is for safety
222- err = sql .ErrProcedureInvalidBodyStatement .New ("LOCK TABLES" )
223- case * plan.UnlockTables : // Blocked in vitess, but this is for safety
224- err = sql .ErrProcedureInvalidBodyStatement .New ("UNLOCK TABLES" )
225- case * plan.Use : // Blocked in vitess, but this is for safety
226- err = sql .ErrProcedureInvalidBodyStatement .New ("USE" )
227- case * plan.LoadData :
228- err = sql .ErrProcedureInvalidBodyStatement .New ("LOAD DATA" )
229- default :
230- return true
231- }
232- return false
233- })
234- if err != nil {
235- return err
236- }
237-
238- return nil
239- }
240-
241161// applyProcedures applies the relevant stored procedures to the node given (if necessary).
242162func applyProcedures (ctx * sql.Context , a * Analyzer , n sql.Node , scope * plan.Scope , sel RuleSelector , qFlags * sql.QueryFlags ) (sql.Node , transform.TreeIdentity , error ) {
243163 if _ , ok := n .(* plan.CreateProcedure ); ok {
0 commit comments