Skip to content

Commit 05c6218

Browse files
craig[bot]KeithCh
andcommitted
Merge #154673
154673: changefeedccl: add syntax support for DB-level ALTER CHANGEFEED r=mgartner,log-head,aerfrei,asg0451 a=KeithCh Add support for ALTER CHANGEFEED SET/UNSET INCLUDE/EXCLUDE TABLES. The following syntax is supported: ALTER CHANGEFEED 123 SET INCLUDE TABLES foo, bar ALTER CHANGEFEED 123 SET EXCLUDE TABLES foo, bar ALTER CHANGEFEED 123 UNSET INCLUDE TABLES ALTER CHANGEFEED 123 UNSET EXCLUDE TABLES Release note: none Resolves: #147428 Co-authored-by: Keith Chow <keith.chow@cockroachlabs.com>
2 parents 31c6535 + b4acc4c commit 05c6218

File tree

5 files changed

+127
-25
lines changed

5 files changed

+127
-25
lines changed

docs/generated/sql/bnf/create_changefeed_stmt.bnf

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ create_changefeed_stmt ::=
44
| 'CREATE' 'CHANGEFEED' for_with_lookahead_variants changefeed_table_target ( ( ',' changefeed_table_target ) )* 'INTO' sink 'WITH' option '=' value ( ( ',' ( option '=' value | option | option '=' value | option ) ) )*
55
| 'CREATE' 'CHANGEFEED' for_with_lookahead_variants changefeed_table_target ( ( ',' changefeed_table_target ) )* 'INTO' sink 'WITH' option ( ( ',' ( option '=' value | option | option '=' value | option ) ) )*
66
| 'CREATE' 'CHANGEFEED' for_with_lookahead_variants changefeed_table_target ( ( ',' changefeed_table_target ) )* 'INTO' sink
7-
| 'CREATE_CHANGEFEED_FOR_DATABASE' 'CHANGEFEED' 'FOR' 'DATABASE' database_option db_level_changefeed_filter_option 'INTO' sink 'WITH' option '=' value ( ( ',' ( option '=' value | option | option '=' value | option ) ) )*
8-
| 'CREATE_CHANGEFEED_FOR_DATABASE' 'CHANGEFEED' 'FOR' 'DATABASE' database_option db_level_changefeed_filter_option 'INTO' sink 'WITH' option ( ( ',' ( option '=' value | option | option '=' value | option ) ) )*
9-
| 'CREATE_CHANGEFEED_FOR_DATABASE' 'CHANGEFEED' 'FOR' 'DATABASE' database_option db_level_changefeed_filter_option 'INTO' sink 'WITH' option '=' value ( ( ',' ( option '=' value | option | option '=' value | option ) ) )*
10-
| 'CREATE_CHANGEFEED_FOR_DATABASE' 'CHANGEFEED' 'FOR' 'DATABASE' database_option db_level_changefeed_filter_option 'INTO' sink 'WITH' option ( ( ',' ( option '=' value | option | option '=' value | option ) ) )*
11-
| 'CREATE_CHANGEFEED_FOR_DATABASE' 'CHANGEFEED' 'FOR' 'DATABASE' database_option db_level_changefeed_filter_option 'INTO' sink
7+
| 'CREATE_CHANGEFEED_FOR_DATABASE' 'CHANGEFEED' 'FOR' 'DATABASE' database_option optional_db_level_changefeed_filter_option 'INTO' sink 'WITH' option '=' value ( ( ',' ( option '=' value | option | option '=' value | option ) ) )*
8+
| 'CREATE_CHANGEFEED_FOR_DATABASE' 'CHANGEFEED' 'FOR' 'DATABASE' database_option optional_db_level_changefeed_filter_option 'INTO' sink 'WITH' option ( ( ',' ( option '=' value | option | option '=' value | option ) ) )*
9+
| 'CREATE_CHANGEFEED_FOR_DATABASE' 'CHANGEFEED' 'FOR' 'DATABASE' database_option optional_db_level_changefeed_filter_option 'INTO' sink 'WITH' option '=' value ( ( ',' ( option '=' value | option | option '=' value | option ) ) )*
10+
| 'CREATE_CHANGEFEED_FOR_DATABASE' 'CHANGEFEED' 'FOR' 'DATABASE' database_option optional_db_level_changefeed_filter_option 'INTO' sink 'WITH' option ( ( ',' ( option '=' value | option | option '=' value | option ) ) )*
11+
| 'CREATE_CHANGEFEED_FOR_DATABASE' 'CHANGEFEED' 'FOR' 'DATABASE' database_option optional_db_level_changefeed_filter_option 'INTO' sink
1212
| 'CREATE' 'CHANGEFEED' 'INTO' sink 'WITH' option '=' value ( ( ',' ( option '=' value | option | option '=' value | option ) ) )* 'AS' 'SELECT' target_list 'FROM' changefeed_target_expr opt_where_clause
1313
| 'CREATE' 'CHANGEFEED' 'INTO' sink 'WITH' option ( ( ',' ( option '=' value | option | option '=' value | option ) ) )* 'AS' 'SELECT' target_list 'FROM' changefeed_target_expr opt_where_clause
1414
| 'CREATE' 'CHANGEFEED' 'INTO' sink 'WITH' option '=' value ( ( ',' ( option '=' value | option | option '=' value | option ) ) )* 'AS' 'SELECT' target_list 'FROM' changefeed_target_expr opt_where_clause

docs/generated/sql/bnf/stmt_block.bnf

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -648,7 +648,7 @@ create_stats_stmt ::=
648648

649649
create_changefeed_stmt ::=
650650
'CREATE' 'CHANGEFEED' for_with_lookahead_variants changefeed_table_targets opt_changefeed_sink opt_with_options
651-
| 'CREATE_CHANGEFEED_FOR_DATABASE' 'CHANGEFEED' 'FOR' 'DATABASE' database_name db_level_changefeed_filter_option opt_changefeed_sink opt_with_options
651+
| 'CREATE_CHANGEFEED_FOR_DATABASE' 'CHANGEFEED' 'FOR' 'DATABASE' database_name optional_db_level_changefeed_filter_option opt_changefeed_sink opt_with_options
652652
| 'CREATE' 'CHANGEFEED' opt_changefeed_sink opt_with_options 'AS' 'SELECT' target_list 'FROM' changefeed_target_expr opt_where_clause
653653

654654
create_extension_stmt ::=
@@ -1965,9 +1965,8 @@ changefeed_table_targets ::=
19651965
opt_changefeed_sink ::=
19661966
'INTO' string_or_placeholder
19671967

1968-
db_level_changefeed_filter_option ::=
1969-
'EXCLUDE' 'TABLES' table_name_list
1970-
| 'INCLUDE' 'TABLES' table_name_list
1968+
optional_db_level_changefeed_filter_option ::=
1969+
db_level_changefeed_filter_option
19711970
|
19721971

19731972
target_list ::=
@@ -2887,8 +2886,9 @@ create_stats_option_list ::=
28872886
changefeed_table_target ::=
28882887
opt_table_prefix table_name opt_changefeed_family
28892888

2890-
table_name_list ::=
2891-
db_object_name_list
2889+
db_level_changefeed_filter_option ::=
2890+
'EXCLUDE' 'TABLES' table_name_list
2891+
| 'INCLUDE' 'TABLES' table_name_list
28922892

28932893
target_elem ::=
28942894
a_expr 'AS' target_name
@@ -2974,6 +2974,9 @@ row_or_rows ::=
29742974
table_index_name_list ::=
29752975
( table_index_name ) ( ( ',' table_index_name ) )*
29762976

2977+
table_name_list ::=
2978+
db_object_name_list
2979+
29772980
view_name_list ::=
29782981
db_object_name_list
29792982

@@ -3299,6 +3302,8 @@ alter_changefeed_cmd ::=
32993302
| 'DROP' changefeed_table_targets
33003303
| 'SET' kv_option_list
33013304
| 'UNSET' name_list
3305+
| 'SET' db_level_changefeed_filter_option
3306+
| 'UNSET' include_or_exclude 'TABLES'
33023307

33033308
alter_backup_cmd ::=
33043309
'ADD' backup_kms
@@ -3564,9 +3569,6 @@ opt_changefeed_family ::=
35643569
'FAMILY' family_name
35653570
|
35663571

3567-
db_object_name_list ::=
3568-
( db_object_name ) ( ( ',' db_object_name ) )*
3569-
35703572
target_name ::=
35713573
unrestricted_name
35723574

@@ -3640,6 +3642,9 @@ only_signed_fconst ::=
36403642
'+' 'FCONST'
36413643
| '-' 'FCONST'
36423644

3645+
db_object_name_list ::=
3646+
( db_object_name ) ( ( ',' db_object_name ) )*
3647+
36433648
inspect_option ::=
36443649
'INDEX' 'ALL'
36453650
| 'INDEX' '(' table_index_name_list ')'
@@ -3839,6 +3844,10 @@ sequence_option_elem ::=
38393844
| 'RESTART' 'WITH' signed_iconst64
38403845
| 'VIRTUAL'
38413846

3847+
include_or_exclude ::=
3848+
'INCLUDE'
3849+
| 'EXCLUDE'
3850+
38423851
backup_kms ::=
38433852
'NEW_KMS' '=' string_or_placeholder_opt_list 'WITH' 'OLD_KMS' '=' string_or_placeholder_opt_list
38443853

pkg/sql/parser/sql.y

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -967,7 +967,10 @@ func (u *sqlSymUnion) doBlockOption() tree.DoBlockOption {
967967
}
968968
func (u *sqlSymUnion) changefeedFilterOption() tree.ChangefeedFilterOption {
969969
return u.val.(tree.ChangefeedFilterOption)
970-
}
970+
}
971+
func (u *sqlSymUnion) filterType() tree.FilterType {
972+
return u.val.(tree.FilterType)
973+
}
971974

972975
%}
973976

@@ -1607,7 +1610,8 @@ func (u *sqlSymUnion) changefeedFilterOption() tree.ChangefeedFilterOption {
16071610
%type <tree.ReturningClause> returning_clause
16081611
%type <tree.TableExprs> opt_using_clause
16091612
%type <tree.RefreshDataOption> opt_clear_data
1610-
%type <tree.ChangefeedFilterOption> db_level_changefeed_filter_option
1613+
%type <tree.ChangefeedFilterOption> db_level_changefeed_filter_option optional_db_level_changefeed_filter_option
1614+
%type <tree.FilterType> include_or_exclude
16111615

16121616
%type <tree.BatchParam> batch_param
16131617
%type <[]tree.BatchParam> batch_param_list
@@ -6273,7 +6277,7 @@ create_changefeed_stmt:
62736277
Level: tree.ChangefeedLevelTable,
62746278
}
62756279
}
6276-
| CREATE_CHANGEFEED_FOR_DATABASE CHANGEFEED FOR DATABASE database_name db_level_changefeed_filter_option opt_changefeed_sink opt_with_options
6280+
| CREATE_CHANGEFEED_FOR_DATABASE CHANGEFEED FOR DATABASE database_name optional_db_level_changefeed_filter_option opt_changefeed_sink opt_with_options
62776281
{
62786282
$$.val = &tree.CreateChangefeed{
62796283
DatabaseTarget: tree.ChangefeedDatabaseTarget($5),
@@ -6504,6 +6508,16 @@ opt_using_clause:
65046508
$$.val = tree.TableExprs{}
65056509
}
65066510

6511+
optional_db_level_changefeed_filter_option:
6512+
db_level_changefeed_filter_option
6513+
{
6514+
$$.val = $1.changefeedFilterOption()
6515+
}
6516+
| /* EMPTY */
6517+
{
6518+
$$.val = tree.ChangefeedFilterOption{}
6519+
}
6520+
65076521
db_level_changefeed_filter_option:
65086522
EXCLUDE TABLES table_name_list
65096523
{
@@ -6513,10 +6527,6 @@ db_level_changefeed_filter_option:
65136527
{
65146528
$$.val = tree.ChangefeedFilterOption{Tables: $3.tableNames(), FilterType: tree.IncludeFilter}
65156529
}
6516-
| /* EMPTY */
6517-
{
6518-
$$.val = tree.ChangefeedFilterOption{}
6519-
}
65206530

65216531

65226532
// %Help: DISCARD - reset the session to its initial state
@@ -7044,7 +7054,32 @@ alter_changefeed_cmd:
70447054
Options: $2.nameList(),
70457055
}
70467056
}
7057+
| SET db_level_changefeed_filter_option
7058+
{
7059+
$$.val = &tree.AlterChangefeedSetFilterOption{
7060+
ChangefeedFilterOption: $2.changefeedFilterOption(),
7061+
}
7062+
}
7063+
| UNSET include_or_exclude TABLES
7064+
{
7065+
$$.val = &tree.AlterChangefeedUnsetFilterOption{
7066+
ChangefeedFilterOption: tree.ChangefeedFilterOption{
7067+
FilterType: $2.filterType(),
7068+
Tables: tree.TableNames{},
7069+
},
7070+
}
7071+
}
70477072

7073+
include_or_exclude:
7074+
INCLUDE
7075+
{
7076+
$$.val = tree.IncludeFilter
7077+
}
7078+
| EXCLUDE
7079+
{
7080+
$$.val = tree.ExcludeFilter
7081+
}
7082+
70487083
// %Help: ALTER BACKUP - alter an existing backup's encryption keys
70497084
// %Category: CCL
70507085
// %Text:

pkg/sql/parser/testdata/alter_changefeed

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,35 @@ ALTER CHANGEFEED 123 ADD TABLE foo, TABLE bar, TABLE baz WITH opt SET qux = 'qu
170170
ALTER CHANGEFEED (123) ADD TABLE (foo), TABLE (bar), TABLE (baz) WITH opt SET qux = ('quux') DROP TABLE (corge) -- fully parenthesized
171171
ALTER CHANGEFEED _ ADD TABLE foo, TABLE bar, TABLE baz WITH opt SET qux = '_' DROP TABLE corge -- literals removed
172172
ALTER CHANGEFEED 123 ADD TABLE _, TABLE _, TABLE _ WITH _ SET _ = 'quux' DROP TABLE _ -- identifiers removed
173+
174+
parse
175+
ALTER CHANGEFEED 123 SET INCLUDE TABLES foo, bar
176+
----
177+
ALTER CHANGEFEED 123 SET INCLUDE TABLES foo, bar
178+
ALTER CHANGEFEED (123) SET INCLUDE TABLES foo, bar -- fully parenthesized
179+
ALTER CHANGEFEED _ SET INCLUDE TABLES foo, bar -- literals removed
180+
ALTER CHANGEFEED 123 SET INCLUDE TABLES _, _ -- identifiers removed
181+
182+
parse
183+
ALTER CHANGEFEED 123 SET EXCLUDE TABLES foo, bar
184+
----
185+
ALTER CHANGEFEED 123 SET EXCLUDE TABLES foo, bar
186+
ALTER CHANGEFEED (123) SET EXCLUDE TABLES foo, bar -- fully parenthesized
187+
ALTER CHANGEFEED _ SET EXCLUDE TABLES foo, bar -- literals removed
188+
ALTER CHANGEFEED 123 SET EXCLUDE TABLES _, _ -- identifiers removed
189+
190+
parse
191+
ALTER CHANGEFEED 123 UNSET INCLUDE TABLES
192+
----
193+
ALTER CHANGEFEED 123 UNSET INCLUDE TABLES -- normalized!
194+
ALTER CHANGEFEED (123) UNSET INCLUDE TABLES -- fully parenthesized
195+
ALTER CHANGEFEED _ UNSET INCLUDE TABLES -- literals removed
196+
ALTER CHANGEFEED 123 UNSET INCLUDE TABLES -- identifiers removed
197+
198+
parse
199+
ALTER CHANGEFEED 123 UNSET EXCLUDE TABLES
200+
----
201+
ALTER CHANGEFEED 123 UNSET EXCLUDE TABLES -- normalized!
202+
ALTER CHANGEFEED (123) UNSET EXCLUDE TABLES -- fully parenthesized
203+
ALTER CHANGEFEED _ UNSET EXCLUDE TABLES -- literals removed
204+
ALTER CHANGEFEED 123 UNSET EXCLUDE TABLES -- identifiers removed

pkg/sql/sem/tree/alter_changefeed.go

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,19 @@ type AlterChangefeedCmd interface {
4141
alterChangefeedCmd()
4242
}
4343

44-
func (*AlterChangefeedAddTarget) alterChangefeedCmd() {}
45-
func (*AlterChangefeedDropTarget) alterChangefeedCmd() {}
46-
func (*AlterChangefeedSetOptions) alterChangefeedCmd() {}
47-
func (*AlterChangefeedUnsetOptions) alterChangefeedCmd() {}
44+
func (*AlterChangefeedAddTarget) alterChangefeedCmd() {}
45+
func (*AlterChangefeedDropTarget) alterChangefeedCmd() {}
46+
func (*AlterChangefeedSetOptions) alterChangefeedCmd() {}
47+
func (*AlterChangefeedUnsetOptions) alterChangefeedCmd() {}
48+
func (*AlterChangefeedSetFilterOption) alterChangefeedCmd() {}
49+
func (*AlterChangefeedUnsetFilterOption) alterChangefeedCmd() {}
4850

4951
var _ AlterChangefeedCmd = &AlterChangefeedAddTarget{}
5052
var _ AlterChangefeedCmd = &AlterChangefeedDropTarget{}
5153
var _ AlterChangefeedCmd = &AlterChangefeedSetOptions{}
5254
var _ AlterChangefeedCmd = &AlterChangefeedUnsetOptions{}
55+
var _ AlterChangefeedCmd = &AlterChangefeedSetFilterOption{}
56+
var _ AlterChangefeedCmd = &AlterChangefeedUnsetFilterOption{}
5357

5458
// AlterChangefeedAddTarget represents an ADD <targets> command
5559
type AlterChangefeedAddTarget struct {
@@ -107,3 +111,25 @@ func (node *AlterChangefeedUnsetOptions) Format(ctx *FmtCtx) {
107111
ctx.WriteString(" UNSET ")
108112
ctx.FormatNode(&node.Options)
109113
}
114+
115+
type AlterChangefeedSetFilterOption struct {
116+
ChangefeedFilterOption ChangefeedFilterOption
117+
}
118+
119+
func (node *AlterChangefeedSetFilterOption) Format(ctx *FmtCtx) {
120+
ctx.WriteString(" SET ")
121+
ctx.WriteString(node.ChangefeedFilterOption.FilterType.String())
122+
ctx.WriteString(" TABLES ")
123+
ctx.FormatNode(&node.ChangefeedFilterOption.Tables)
124+
}
125+
126+
type AlterChangefeedUnsetFilterOption struct {
127+
ChangefeedFilterOption ChangefeedFilterOption
128+
}
129+
130+
func (node *AlterChangefeedUnsetFilterOption) Format(ctx *FmtCtx) {
131+
ctx.WriteString(" UNSET ")
132+
ctx.WriteString(node.ChangefeedFilterOption.FilterType.String())
133+
ctx.WriteString(" TABLES ")
134+
ctx.FormatNode(&node.ChangefeedFilterOption.Tables)
135+
}

0 commit comments

Comments
 (0)