Skip to content

Commit 43b468c

Browse files
authored
Merge pull request #2350 from dolthub/jennifer/fix
add `plpgsql-dynexecute` statement for CREATE FUNCTION
2 parents 8c297bc + 0b5e1a6 commit 43b468c

21 files changed

+295
-88
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright 2026 Dolthub, Inc.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package ast
16+
17+
import (
18+
vitess "github.com/dolthub/vitess/go/vt/sqlparser"
19+
20+
"github.com/dolthub/doltgresql/postgres/parser/sem/tree"
21+
)
22+
23+
// nodeAlterDefaultPrivileges handles *tree.AlterDefaultPrivileges nodes.
24+
func nodeAlterDefaultPrivileges(ctx *Context, node *tree.AlterDefaultPrivileges) (vitess.Statement, error) {
25+
return NotYetSupportedError("ALTER DEFAULT PRIVILEGES statement is not yet supported")
26+
}

server/ast/alter_table.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ func nodeAlterTableAlterColumnType(ctx *Context, node *tree.AlterTableAlterColum
324324
return nil, errors.Errorf("ALTER TABLE with USING is not supported yet")
325325
}
326326

327-
convertType, resolvedType, err := nodeResolvableTypeReference(ctx, node.ToType)
327+
convertType, resolvedType, err := nodeResolvableTypeReference(ctx, node.ToType, false)
328328
if err != nil {
329329
return nil, err
330330
}

server/ast/column_table_def.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func nodeColumnTableDef(ctx *Context, node *tree.ColumnTableDef) (*vitess.Column
3737
len(node.UniqueConstraintName) > 0 {
3838
return nil, errors.Errorf("non-foreign key column constraint names are not yet supported")
3939
}
40-
convertType, resolvedType, err := nodeResolvableTypeReference(ctx, node.Type)
40+
convertType, resolvedType, err := nodeResolvableTypeReference(ctx, node.Type, false)
4141
if err != nil {
4242
return nil, err
4343
}

server/ast/convert.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ func Convert(postgresStmt parser.Statement) (vitess.Statement, error) {
3131
return nodeAlterAggregate(ctx, stmt)
3232
case *tree.AlterDatabase:
3333
return nodeAlterDatabase(ctx, stmt)
34+
case *tree.AlterDefaultPrivileges:
35+
return nodeAlterDefaultPrivileges(ctx, stmt)
3436
case *tree.AlterFunction:
3537
return nodeAlterFunction(ctx, stmt)
3638
case *tree.AlterIndex:

server/ast/create_domain.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func nodeCreateDomain(ctx *Context, node *tree.CreateDomain) (vitess.Statement,
3434
if err != nil {
3535
return nil, err
3636
}
37-
_, dataType, err := nodeResolvableTypeReference(ctx, node.DataType)
37+
_, dataType, err := nodeResolvableTypeReference(ctx, node.DataType, false)
3838
if err != nil {
3939
return nil, err
4040
}

server/ast/create_function.go

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"github.com/dolthub/doltgresql/core/id"
2626
"github.com/dolthub/doltgresql/postgres/parser/parser"
2727
"github.com/dolthub/doltgresql/postgres/parser/sem/tree"
28-
"github.com/dolthub/doltgresql/postgres/parser/types"
2928
"github.com/dolthub/doltgresql/server/functions/framework"
3029
pgnodes "github.com/dolthub/doltgresql/server/node"
3130
"github.com/dolthub/doltgresql/server/plpgsql"
@@ -43,21 +42,11 @@ func nodeCreateFunction(ctx *Context, node *tree.CreateFunction) (vitess.Stateme
4342
var retType *pgtypes.DoltgresType
4443
if len(node.RetType) == 0 {
4544
retType = pgtypes.Void
46-
} else if !node.ReturnsTable { // Return types may specify "trigger", but this doesn't apply elsewhere
47-
switch typ := node.RetType[0].Type.(type) {
48-
case *types.T:
49-
retType = pgtypes.NewUnresolvedDoltgresType("", strings.ToLower(typ.Name()))
50-
case *tree.UnresolvedObjectName:
51-
if typ.NumParts == 1 && typ.SQLString() == "trigger" {
52-
retType = pgtypes.Trigger
53-
} else {
54-
_, retType, err = nodeResolvableTypeReference(ctx, typ)
55-
if err != nil {
56-
return nil, err
57-
}
58-
}
59-
default:
60-
return nil, fmt.Errorf("unsupported ResolvableTypeReference type: %T", typ)
45+
} else if !node.ReturnsTable {
46+
// Return types may specify "trigger", but this doesn't apply elsewhere
47+
_, retType, err = nodeResolvableTypeReference(ctx, node.RetType[0].Type, true)
48+
if err != nil {
49+
return nil, err
6150
}
6251
} else {
6352
retType = createAnonymousCompositeType(node.RetType)
@@ -67,16 +56,9 @@ func nodeCreateFunction(ctx *Context, node *tree.CreateFunction) (vitess.Stateme
6756
paramTypes := make([]*pgtypes.DoltgresType, len(node.Args))
6857
for i, arg := range node.Args {
6958
paramNames[i] = arg.Name.String()
70-
switch argType := arg.Type.(type) {
71-
case *types.T:
72-
paramTypes[i] = pgtypes.NewUnresolvedDoltgresType("", strings.ToLower(argType.Name()))
73-
case *tree.UnresolvedObjectName:
74-
_, paramTypes[i], err = nodeResolvableTypeReference(ctx, argType)
75-
if err != nil {
76-
return nil, err
77-
}
78-
default:
79-
paramTypes[i] = pgtypes.NewUnresolvedDoltgresType("", strings.ToLower(argType.SQLString()))
59+
_, paramTypes[i], err = nodeResolvableTypeReference(ctx, arg.Type, false)
60+
if err != nil {
61+
return nil, err
8062
}
8163
}
8264
var strict bool
@@ -99,6 +81,23 @@ func nodeCreateFunction(ctx *Context, node *tree.CreateFunction) (vitess.Stateme
9981
if err != nil {
10082
return nil, err
10183
}
84+
// parse types
85+
for i, op := range parsedBody {
86+
switch op.OpCode {
87+
case plpgsql.OpCode_Declare:
88+
// ParseType uses casting to parse the given type, but
89+
// some special types cannot be cast. Eg: `user_defined_table_type%ROWTYPE`
90+
if declareTyp, err := parser.ParseType(op.PrimaryData); err == nil {
91+
if _, dt, err := nodeResolvableTypeReference(ctx, declareTyp, false); err == nil && dt != nil {
92+
dtName := dt.Name()
93+
if dt.Schema() != "" {
94+
dtName = fmt.Sprintf("%s.%s", dt.Schema(), dtName)
95+
}
96+
parsedBody[i].PrimaryData = dtName
97+
}
98+
}
99+
}
100+
}
102101
case "sql":
103102
as, ok := options[tree.OptionAs1]
104103
if !ok {

server/ast/create_sequence.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func nodeCreateSequence(ctx *Context, node *tree.CreateSequence) (vitess.Stateme
6767
if !dataType.IsEmptyType() {
6868
return nil, errors.Errorf("conflicting or redundant options")
6969
}
70-
_, dataType, err = nodeResolvableTypeReference(ctx, option.AsType)
70+
_, dataType, err = nodeResolvableTypeReference(ctx, option.AsType, false)
7171
if err != nil {
7272
return nil, err
7373
}

server/ast/create_type.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func nodeCreateType(ctx *Context, node *tree.CreateType) (vitess.Statement, erro
4040
case tree.Composite:
4141
typs := make([]pgnodes.CompositeAsType, len(node.Composite.Types))
4242
for i, t := range node.Composite.Types {
43-
_, dataType, err := nodeResolvableTypeReference(ctx, t.Type)
43+
_, dataType, err := nodeResolvableTypeReference(ctx, t.Type, false)
4444
if err != nil {
4545
return nil, err
4646
}

server/ast/expr.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func nodeExpr(ctx *Context, node tree.Expr) (vitess.Expr, error) {
110110
unresolvedChildren := make([]vitess.Expr, len(node.Exprs))
111111
var coercedType *pgtypes.DoltgresType
112112
if node.HasResolvedType() {
113-
_, resolvedType, err := nodeResolvableTypeReference(ctx, node.ResolvedType())
113+
_, resolvedType, err := nodeResolvableTypeReference(ctx, node.ResolvedType(), false)
114114
if err != nil {
115115
return nil, err
116116
}
@@ -259,7 +259,7 @@ func nodeExpr(ctx *Context, node tree.Expr) (vitess.Expr, error) {
259259
return nil, errors.Errorf("unknown cast syntax")
260260
}
261261

262-
convertType, resolvedType, err := nodeResolvableTypeReference(ctx, node.Type)
262+
convertType, resolvedType, err := nodeResolvableTypeReference(ctx, node.Type, false)
263263
if err != nil {
264264
return nil, err
265265
}
@@ -593,7 +593,7 @@ func nodeExpr(ctx *Context, node tree.Expr) (vitess.Expr, error) {
593593
defVal := &vitess.Default{ColName: ""}
594594
return defVal, nil
595595
case tree.DomainColumn:
596-
_, dataType, err := nodeResolvableTypeReference(ctx, node.Typ)
596+
_, dataType, err := nodeResolvableTypeReference(ctx, node.Typ, false)
597597
if err != nil {
598598
return nil, err
599599
}

0 commit comments

Comments
 (0)