MCPcopy Create free account
hub / github.com/dolthub/doltgresql / nodeCreateProcedure

Function nodeCreateProcedure

server/ast/create_procedure.go:33–147  ·  view source on GitHub ↗

nodeCreateProcedure handles *tree.CreateProcedure nodes.

(ctx *Context, node *tree.CreateProcedure)

Source from the content-addressed store, hash-verified

31
32// nodeCreateProcedure handles *tree.CreateProcedure nodes.
33func nodeCreateProcedure(ctx *Context, node *tree.CreateProcedure) (vitess.Statement, error) {
34 options, err := validateRoutineOptions(ctx, node.Options)
35 if err != nil {
36 return nil, err
37 }
38 // Grab the general information that we'll need to create the procedure
39 tableName := node.Name.ToTableName()
40 params := make([]pgnodes.RoutineParam, len(node.Args))
41 var defaults []vitess.Expr
42 for i, arg := range node.Args {
43 // parameter name
44 params[i].Name = arg.Name.String()
45 // parameter type
46 _, params[i].Type, err = nodeResolvableTypeReference(ctx, arg.Type, false)
47 if err != nil {
48 return nil, err
49 }
50 // parameter mode
51 switch arg.Mode {
52 case tree.RoutineArgModeIn:
53 params[i].Mode = procedures.ParameterMode_IN
54 case tree.RoutineArgModeVariadic:
55 params[i].Mode = procedures.ParameterMode_VARIADIC
56 case tree.RoutineArgModeOut:
57 params[i].Mode = procedures.ParameterMode_OUT
58 case tree.RoutineArgModeInout:
59 params[i].Mode = procedures.ParameterMode_INOUT
60 default:
61 return nil, errors.Newf("unknown procedure argmode: `%v`", arg.Mode)
62 }
63 // parameter default
64 if arg.Default != nil {
65 params[i].HasDefault = true
66 d, err := nodeExpr(ctx, arg.Default)
67 if err != nil {
68 return nil, err
69 }
70 defaults = append(defaults, d)
71 }
72 }
73 // We only support PL/pgSQL, SQL and C for now, so we verify that here
74 var parsedBody []plpgsql.InterpreterOperation
75 var sqlDef string
76 var sqlDefParsedStmts []vitess.Statement
77 var extensionName, extensionSymbol string
78 if languageOption, ok := options[tree.OptionLanguage]; ok {
79 switch strings.ToLower(languageOption.Language) {
80 case "plpgsql":
81 // PL/pgSQL is different from standard Postgres SQL, so we have to use a special parser to handle it.
82 // This parser also requires the full `CREATE PROCEDURE` string, so we'll pass that.
83 parsedBody, err = plpgsql.Parse(ctx.originalQuery)
84 if err != nil {
85 return nil, err
86 }
87 // parse types
88 for i, op := range parsedBody {
89 switch op.OpCode {
90 case plpgsql.OpCode_Declare:

Callers 1

ConvertFunction · 0.85

Calls 13

ParseFunction · 0.92
ParseTypeFunction · 0.92
validateRoutineOptionsFunction · 0.85
nodeExprFunction · 0.85
handleLanguageSQLAsFunction · 0.85
ToTableNameMethod · 0.80
StringMethod · 0.65
NameMethod · 0.65
SchemaMethod · 0.65
ErrorfMethod · 0.65
CatalogMethod · 0.65

Tested by

no test coverage detected