Skip to content

Commit 8580556

Browse files
authored
Merge pull request #2353 from dolthub/jennifer/view-cte
allow cte in CREATE VIEW
2 parents 43b468c + 5f639aa commit 8580556

9 files changed

Lines changed: 112 additions & 21 deletions

File tree

postgres/parser/parser/sql.y

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,7 +1156,7 @@ func (u *sqlSymUnion) vacuumTableAndColsList() tree.VacuumTableAndColsList {
11561156
%type <*tree.UnresolvedObjectName> table_name standalone_index_name sequence_name type_name routine_name aggregate_name
11571157
%type <*tree.UnresolvedObjectName> view_name db_object_name simple_db_object_name complex_db_object_name opt_collate
11581158
%type <*tree.UnresolvedObjectName> db_object_name_no_keywords simple_db_object_name_no_keywords complex_db_object_name_no_keywords
1159-
%type <[]*tree.UnresolvedObjectName> type_name_list
1159+
%type <[]*tree.UnresolvedObjectName> type_name_list sequence_name_list
11601160
%type <str> schema_name opt_schema_name opt_schema opt_version tablespace_name partition_name
11611161
%type <[]string> schema_name_list role_spec_list opt_role_list opt_owned_by_list
11621162
%type <*tree.UnresolvedName> table_pattern complex_table_pattern
@@ -2339,15 +2339,15 @@ row_level_security:
23392339
{
23402340
$$.val = &tree.AlterTableRowLevelSecurity{Type: tree.RowLevelSecurityDisable}
23412341
}
2342-
| ENABLE
2342+
| ENABLE ROW LEVEL SECURITY
23432343
{
23442344
$$.val = &tree.AlterTableRowLevelSecurity{Type: tree.RowLevelSecurityEnable}
23452345
}
2346-
| FORCE
2346+
| FORCE ROW LEVEL SECURITY
23472347
{
23482348
$$.val = &tree.AlterTableRowLevelSecurity{Type: tree.RowLevelSecurityForce}
23492349
}
2350-
| NO FORCE
2350+
| NO FORCE ROW LEVEL SECURITY
23512351
{
23522352
$$.val = &tree.AlterTableRowLevelSecurity{Type: tree.RowLevelSecurityNoForce}
23532353
}
@@ -5533,9 +5533,9 @@ targets:
55335533
55345534
// these can be extended to more detailed rules
55355535
other_targets:
5536-
SEQUENCE name_list
5536+
SEQUENCE sequence_name_list
55375537
{
5538-
$$.val = tree.TargetList{TargetType: privilege.Sequence, Sequences: $2.nameList()}
5538+
$$.val = tree.TargetList{TargetType: privilege.Sequence, Sequences: $2.unresolvedObjectNames()}
55395539
}
55405540
| DATABASE name_list
55415541
{
@@ -5621,13 +5621,13 @@ routine_with_args_list:
56215621
}
56225622
56235623
routine_with_args:
5624-
name
5624+
routine_name
56255625
{
5626-
$$.val = tree.Routine{Name: tree.Name($1), Args: nil}
5626+
$$.val = tree.Routine{Name: $1.unresolvedObjectName(), Args: nil}
56275627
}
5628-
| name '(' opt_routine_args ')'
5628+
| routine_name '(' opt_routine_args ')'
56295629
{
5630-
$$.val = tree.Routine{Name: tree.Name($1), Args: $3.routineArgs()}
5630+
$$.val = tree.Routine{Name: $1.unresolvedObjectName(), Args: $3.routineArgs()}
56315631
}
56325632
56335633
opt_with_grant_option:
@@ -14210,6 +14210,16 @@ name_list:
1421014210
{
1421114211
$$.val = append($1.nameList(), tree.Name($3))
1421214212
}
14213+
14214+
sequence_name_list:
14215+
sequence_name
14216+
{
14217+
$$.val = []*tree.UnresolvedObjectName{$1.unresolvedObjectName()}
14218+
}
14219+
| sequence_name_list ',' sequence_name
14220+
{
14221+
$$.val = append($1.unresolvedObjectNames(), $3.unresolvedObjectName())
14222+
}
1421314223

1421414224
// Constants
1421514225
numeric_only:

postgres/parser/sem/tree/grant.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ type TargetList struct {
9797

9898
Tables TablePatterns
9999
TableColumnNames NameList
100-
Sequences NameList
100+
Sequences []*UnresolvedObjectName
101101
Databases NameList
102102
LargeObjects []Expr
103103
Routines []Routine
@@ -116,7 +116,7 @@ type TargetList struct {
116116

117117
// Routine used for { FUNCTION | PROCEDURE | ROUTINE }
118118
type Routine struct {
119-
Name Name
119+
Name *UnresolvedObjectName
120120
Args RoutineArgs
121121
}
122122

@@ -143,7 +143,12 @@ func (tl *TargetList) Format(ctx *FmtCtx) {
143143
}
144144
} else {
145145
ctx.WriteString("SEQUENCE ")
146-
ctx.FormatNode(&tl.Sequences)
146+
for i, typ := range tl.Types {
147+
if i != 0 {
148+
ctx.WriteString(", ")
149+
}
150+
ctx.FormatNode(typ)
151+
}
147152
}
148153
case privilege.Database:
149154
ctx.WriteString("DATABASE ")
@@ -163,7 +168,7 @@ func (tl *TargetList) Format(ctx *FmtCtx) {
163168
if i != 0 {
164169
ctx.WriteString(", ")
165170
}
166-
ctx.FormatNode(&r.Name)
171+
ctx.FormatNode(r.Name)
167172
if len(r.Args) != 0 {
168173
ctx.WriteString(" ( ")
169174
ctx.FormatNode(r.Args)

server/ast/create_view.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func nodeCreateView(ctx *Context, node *tree.CreateView) (*vitess.DDL, error) {
8181
if err != nil {
8282
return nil, err
8383
}
84-
selectStmt, err := nodeSelectStatement(ctx, node.AsSource.Select)
84+
selectStmt, err := nodeSelect(ctx, node.AsSource)
8585
if err != nil {
8686
return nil, err
8787
}
@@ -100,7 +100,7 @@ func nodeCreateView(ctx *Context, node *tree.CreateView) (*vitess.DDL, error) {
100100
Security: sqlSecurity,
101101
CheckOption: vCheckOpt,
102102
},
103-
SubStatementStr: node.AsSource.Select.String(),
103+
SubStatementStr: node.AsSource.String(),
104104
}
105105
return stmt, nil
106106
}

server/ast/func_expr.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,18 @@ func nodeFuncExpr(ctx *Context, node *tree.FuncExpr) (vitess.Expr, error) {
7575
if len(node.Exprs) != 2 {
7676
return nil, errors.Errorf("string_agg requires two arguments")
7777
}
78-
sep, ok := node.Exprs[1].(*tree.StrVal)
79-
if !ok {
80-
return nil, errors.Errorf("string_agg requires a string separator")
78+
79+
sepString := ""
80+
if sep, ok := node.Exprs[1].(*tree.StrVal); ok {
81+
sepString = strings.Trim(sep.String(), "'")
82+
} else {
83+
// TODO: need to support this function in doltgres
84+
c, is := node.Exprs[1].(*tree.CastExpr)
85+
if !is && c.Type.SQLString() != "TEXT" {
86+
return nil, errors.Errorf("string_agg requires a string separator")
87+
}
88+
sepString = strings.Trim(c.Expr.String(), "'")
8189
}
82-
sepString := strings.Trim(sep.String(), "'")
8390

8491
var orderBy vitess.OrderBy
8592
if len(node.OrderBy) > 0 {

server/ast/limit.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626

2727
// nodeLimit handles *tree.Limit nodes.
2828
func nodeLimit(ctx *Context, node *tree.Limit) (*vitess.Limit, error) {
29-
if node == nil || (node.Count == nil && node.Offset == nil) {
29+
if node == nil || ((node.Count == nil || node.Count == tree.NullLiteral{}) && (node.Offset == nil || node.Offset == tree.NullLiteral{})) {
3030
return nil, nil
3131
}
3232
var count vitess.Expr

testing/go/auth_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,43 @@ func TestAuthTests(t *testing.T) {
436436
},
437437
},
438438
},
439+
{
440+
Skip: true,
441+
Name: `GRANT ON PROCEDURE`,
442+
SetUpScript: []string{
443+
`CREATE USER user1 PASSWORD 'a';`,
444+
`CREATE TABLE test (v1 TEXT);`,
445+
`CREATE PROCEDURE interpreted_example(input TEXT) AS $$ BEGIN INSERT INTO test VALUES ('1' || input); END; $$ LANGUAGE plpgsql;`,
446+
},
447+
Assertions: []ScriptTestAssertion{
448+
{
449+
Query: "CALL interpreted_example('12');",
450+
Username: `user1`,
451+
Password: `a`,
452+
ExpectedErr: `denied`,
453+
},
454+
{
455+
Query: `GRANT ALL ON PROCEDURE public.interpreted_example(input TEXT) TO user1;`,
456+
Username: authTestSuperUser,
457+
Password: authTestSuperPass,
458+
Expected: []sql.Row{},
459+
},
460+
{
461+
Query: "CALL interpreted_example('12');",
462+
Username: `user1`,
463+
Password: `a`,
464+
Expected: []sql.Row{},
465+
},
466+
{
467+
Query: "SELECT * FROM test;",
468+
Username: authTestSuperUser,
469+
Password: authTestSuperPass,
470+
Expected: []sql.Row{
471+
{"712"},
472+
},
473+
},
474+
},
475+
},
439476
{
440477
Name: `INSERT, UPDATE, DELETE Privileges`,
441478
SetUpScript: []string{

testing/go/create_view_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,4 +248,16 @@ var createViewStmts = []ScriptTest{
248248
},
249249
},
250250
},
251+
{
252+
Name: "create view with CTE",
253+
SetUpScript: []string{
254+
"CREATE TABLE public.t1 (id integer NOT NULL);",
255+
},
256+
Assertions: []ScriptTestAssertion{
257+
{
258+
Query: `create view public.v1 as with table1 as (select * from t1) select id from table1;`,
259+
Expected: []sql.Row{},
260+
},
261+
},
262+
},
251263
}

testing/go/functions_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3414,6 +3414,18 @@ func TestStringFunction(t *testing.T) {
34143414
Query: `SELECT STRING_AGG(v2) FROM test;`,
34153415
ExpectedErr: "string_agg requires two arguments",
34163416
},
3417+
{
3418+
Query: `SELECT STRING_AGG(concat(v1::text, v2), ' * '::text) FROM test;`,
3419+
Expected: []sql.Row{
3420+
{"1a * 2b * 3c * 4d * 5e"},
3421+
},
3422+
},
3423+
{
3424+
Query: `SELECT STRING_AGG(concat(v1::text, v2), 8::text) FROM test;`,
3425+
Expected: []sql.Row{
3426+
{"1a82b83c84d85e"},
3427+
},
3428+
},
34173429
},
34183430
},
34193431
})

testing/go/import_dumps_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ func TestImportingDumps(t *testing.T) {
7676
SQLFilename: "Ansh-Rathod_Musive-backend-2.0.sql",
7777
},
7878
{
79+
SetUpScript: []string{
80+
"CREATE USER app_admin WITH SUPERUSER PASSWORD 'password';",
81+
"CREATE USER analytics_viewer WITH SUPERUSER PASSWORD 'password';",
82+
"CREATE USER content_manager WITH SUPERUSER PASSWORD 'password';",
83+
},
7984
Name: "artygg/Data-Processing-Goida",
8085
SQLFilename: "artygg_Data-Processing-Goida.sql",
8186
},
@@ -84,6 +89,9 @@ func TestImportingDumps(t *testing.T) {
8489
SQLFilename: "bartr_agency.sql",
8590
},
8691
{
92+
SetUpScript: []string{
93+
"CREATE USER edm WITH SUPERUSER PASSWORD 'password';",
94+
},
8795
Name: "bclynch/edmflare",
8896
SQLFilename: "bclynch_edmflare.sql",
8997
},

0 commit comments

Comments
 (0)