Skip to content

Commit

Permalink
sql/parser: parse CREATE LOGICALLY REPLICATED TABLE options seperately
Browse files Browse the repository at this point in the history
The two different CREATE LDR incancatations will require different options, so
we should validate which options apply to which incantation at parsing time.

Epic: none

Release note: none
  • Loading branch information
msbutler committed Jan 3, 2025
1 parent 393c4f9 commit 4afbca3
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 2 deletions.
45 changes: 43 additions & 2 deletions pkg/sql/parser/sql.y
Original file line number Diff line number Diff line change
Expand Up @@ -1264,7 +1264,7 @@ func (u *sqlSymUnion) indexType() tree.IndexType {
%type <tree.Statement> create_policy_stmt

%type <tree.LogicalReplicationResources> logical_replication_resources, logical_replication_resources_list
%type <*tree.LogicalReplicationOptions> opt_logical_replication_options logical_replication_options logical_replication_options_list
%type <*tree.LogicalReplicationOptions> opt_logical_replication_options logical_replication_options logical_replication_options_list opt_logical_replication_create_table_options logical_replication_create_table_options logical_replication_create_table_options_list

%type <tree.Statement> create_stats_stmt
%type <*tree.CreateStatsOptions> opt_create_stats_options
Expand Down Expand Up @@ -4666,7 +4666,7 @@ create_logical_replication_stream_stmt:
Options: *$11.logicalReplicationOptions(),
}
}
| CREATE LOGICALLY REPLICATED logical_replication_resources FROM logical_replication_resources ON string_or_placeholder opt_logical_replication_options
| CREATE LOGICALLY REPLICATED logical_replication_resources FROM logical_replication_resources ON string_or_placeholder opt_logical_replication_create_table_options
{
$$.val = &tree.CreateLogicalReplicationStream{
Into: $4.logicalReplicationResources(),
Expand Down Expand Up @@ -4729,6 +4729,20 @@ opt_logical_replication_options:
$$.val = &tree.LogicalReplicationOptions{}
}

opt_logical_replication_create_table_options:
WITH logical_replication_create_table_options_list
{
$$.val = $2.logicalReplicationOptions()
}
| WITH OPTIONS '(' logical_replication_create_table_options_list ')'
{
$$.val = $4.logicalReplicationOptions()
}
| /* EMPTY */
{
$$.val = &tree.LogicalReplicationOptions{}
}

logical_replication_options_list:
// Require at least one option
logical_replication_options
Expand All @@ -4742,6 +4756,19 @@ logical_replication_options_list:
}
}

logical_replication_create_table_options_list:
// Require at least one option
logical_replication_create_table_options
{
$$.val = $1.logicalReplicationOptions()
}
| logical_replication_create_table_options_list ',' logical_replication_create_table_options
{
if err := $1.logicalReplicationOptions().CombineWith($3.logicalReplicationOptions()); err != nil {
return setErr(sqllex, err)
}
}

// List of valid logical replication options.
logical_replication_options:
CURSOR '=' string_or_placeholder
Expand Down Expand Up @@ -4774,6 +4801,20 @@ logical_replication_options:
$$.val = &tree.LogicalReplicationOptions{MetricsLabel: $3.expr()}
}

logical_replication_create_table_options:
MODE '=' string_or_placeholder
{
$$.val = &tree.LogicalReplicationOptions{Mode: $3.expr()}
}
| DISCARD '=' string_or_placeholder
{
$$.val = &tree.LogicalReplicationOptions{Discard: $3.expr()}
}
| LABEL '=' string_or_placeholder
{
$$.val = &tree.LogicalReplicationOptions{MetricsLabel: $3.expr()}
}

// %Help: CREATE VIRTUAL CLUSTER - create a new virtual cluster
// %Category: Experimental
// %Text:
Expand Down
17 changes: 17 additions & 0 deletions pkg/sql/parser/testdata/create_logical_replication
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,23 @@ CREATE LOGICALLY REPLICATED TABLE (foo) FROM TABLE (foo) ON ('uri') -- fully par
CREATE LOGICALLY REPLICATED TABLE foo FROM TABLE foo ON '_' -- literals removed
CREATE LOGICALLY REPLICATED TABLE _ FROM TABLE _ ON 'uri' -- identifiers removed

error
CREATE LOGICALLY REPLICATED TABLE foo FROM TABLE foo ON 'uri' WITH CURSOR = '1536242855577149065.0000000000';
----
at or near "cursor": syntax error
DETAIL: source SQL:
CREATE LOGICALLY REPLICATED TABLE foo FROM TABLE foo ON 'uri' WITH CURSOR = '1536242855577149065.0000000000'
^
HINT: try \h CREATE

parse
CREATE LOGICALLY REPLICATED TABLE foo FROM TABLE foo ON 'uri' WITH MODE = 'immediate';
----
CREATE LOGICALLY REPLICATED TABLE foo FROM TABLE foo ON 'uri' WITH OPTIONS (MODE = 'immediate') -- normalized!
CREATE LOGICALLY REPLICATED TABLE (foo) FROM TABLE (foo) ON ('uri') WITH OPTIONS (MODE = ('immediate')) -- fully parenthesized
CREATE LOGICALLY REPLICATED TABLE foo FROM TABLE foo ON '_' WITH OPTIONS (MODE = '_') -- literals removed
CREATE LOGICALLY REPLICATED TABLE _ FROM TABLE _ ON 'uri' WITH OPTIONS (MODE = 'immediate') -- identifiers removed

parse
CREATE LOGICAL REPLICATION STREAM FROM TABLE foo.bar ON 'uri' INTO TABLE foo.bar;
----
Expand Down

0 comments on commit 4afbca3

Please sign in to comment.