diff --git a/docs/generated/sql/bnf/alter_table.bnf b/docs/generated/sql/bnf/alter_table.bnf index c3d4dfcf7380..1da9dbc6ec78 100644 --- a/docs/generated/sql/bnf/alter_table.bnf +++ b/docs/generated/sql/bnf/alter_table.bnf @@ -1,3 +1,3 @@ alter_onetable_stmt ::= - 'ALTER' 'TABLE' table_name ( ( ( 'RENAME' ( 'COLUMN' | ) column_name 'TO' column_name | 'RENAME' 'CONSTRAINT' column_name 'TO' column_name | 'ADD' ( column_name typename col_qual_list ) | 'ADD' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DEFAULT' a_expr | 'DROP' 'DEFAULT' ) | 'ALTER' ( 'COLUMN' | ) column_name alter_column_on_update | 'ALTER' ( 'COLUMN' | ) column_name alter_column_visible | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | 'ALTER' ( 'COLUMN' | ) column_name 'SET' 'NOT' 'NULL' | 'DROP' ( 'COLUMN' | ) 'IF' 'EXISTS' column_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' ( 'COLUMN' | ) column_name ( 'CASCADE' | 'RESTRICT' | ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DATA' | ) 'TYPE' typename ( 'COLLATE' collation_name | ) ( 'USING' a_expr | ) | 'ADD' ( 'CONSTRAINT' constraint_name constraint_elem | constraint_elem ) | 'ADD' 'CONSTRAINT' 'IF' 'NOT' 'EXISTS' constraint_name constraint_elem | 'ALTER' 'PRIMARY' 'KEY' 'USING' 'COLUMNS' '(' index_params ')' opt_hash_sharded | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' 'CONSTRAINT' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by_table | 'SET' '(' storage_parameter_list ')' ) ) ( ( ',' ( 'RENAME' ( 'COLUMN' | ) column_name 'TO' column_name | 'RENAME' 'CONSTRAINT' column_name 'TO' column_name | 'ADD' ( column_name typename col_qual_list ) | 'ADD' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DEFAULT' a_expr | 'DROP' 'DEFAULT' ) | 'ALTER' ( 'COLUMN' | ) column_name alter_column_on_update | 'ALTER' ( 'COLUMN' | ) column_name alter_column_visible | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | 'ALTER' ( 'COLUMN' | ) column_name 'SET' 'NOT' 'NULL' | 'DROP' ( 'COLUMN' | ) 'IF' 'EXISTS' column_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' ( 'COLUMN' | ) column_name ( 'CASCADE' | 'RESTRICT' | ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DATA' | ) 'TYPE' typename ( 'COLLATE' collation_name | ) ( 'USING' a_expr | ) | 'ADD' ( 'CONSTRAINT' constraint_name constraint_elem | constraint_elem ) | 'ADD' 'CONSTRAINT' 'IF' 'NOT' 'EXISTS' constraint_name constraint_elem | 'ALTER' 'PRIMARY' 'KEY' 'USING' 'COLUMNS' '(' index_params ')' opt_hash_sharded | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' 'CONSTRAINT' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by_table | 'SET' '(' storage_parameter_list ')' ) ) )* ) - | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name ( ( ( 'RENAME' ( 'COLUMN' | ) column_name 'TO' column_name | 'RENAME' 'CONSTRAINT' column_name 'TO' column_name | 'ADD' ( column_name typename col_qual_list ) | 'ADD' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DEFAULT' a_expr | 'DROP' 'DEFAULT' ) | 'ALTER' ( 'COLUMN' | ) column_name alter_column_on_update | 'ALTER' ( 'COLUMN' | ) column_name alter_column_visible | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | 'ALTER' ( 'COLUMN' | ) column_name 'SET' 'NOT' 'NULL' | 'DROP' ( 'COLUMN' | ) 'IF' 'EXISTS' column_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' ( 'COLUMN' | ) column_name ( 'CASCADE' | 'RESTRICT' | ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DATA' | ) 'TYPE' typename ( 'COLLATE' collation_name | ) ( 'USING' a_expr | ) | 'ADD' ( 'CONSTRAINT' constraint_name constraint_elem | constraint_elem ) | 'ADD' 'CONSTRAINT' 'IF' 'NOT' 'EXISTS' constraint_name constraint_elem | 'ALTER' 'PRIMARY' 'KEY' 'USING' 'COLUMNS' '(' index_params ')' opt_hash_sharded | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' 'CONSTRAINT' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by_table | 'SET' '(' storage_parameter_list ')' ) ) ( ( ',' ( 'RENAME' ( 'COLUMN' | ) column_name 'TO' column_name | 'RENAME' 'CONSTRAINT' column_name 'TO' column_name | 'ADD' ( column_name typename col_qual_list ) | 'ADD' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DEFAULT' a_expr | 'DROP' 'DEFAULT' ) | 'ALTER' ( 'COLUMN' | ) column_name alter_column_on_update | 'ALTER' ( 'COLUMN' | ) column_name alter_column_visible | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | 'ALTER' ( 'COLUMN' | ) column_name 'SET' 'NOT' 'NULL' | 'DROP' ( 'COLUMN' | ) 'IF' 'EXISTS' column_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' ( 'COLUMN' | ) column_name ( 'CASCADE' | 'RESTRICT' | ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DATA' | ) 'TYPE' typename ( 'COLLATE' collation_name | ) ( 'USING' a_expr | ) | 'ADD' ( 'CONSTRAINT' constraint_name constraint_elem | constraint_elem ) | 'ADD' 'CONSTRAINT' 'IF' 'NOT' 'EXISTS' constraint_name constraint_elem | 'ALTER' 'PRIMARY' 'KEY' 'USING' 'COLUMNS' '(' index_params ')' opt_hash_sharded | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' 'CONSTRAINT' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by_table | 'SET' '(' storage_parameter_list ')' ) ) )* ) + 'ALTER' 'TABLE' table_name ( ( ( 'RENAME' ( 'COLUMN' | ) column_name 'TO' column_name | 'RENAME' 'CONSTRAINT' column_name 'TO' column_name | 'ADD' ( column_name typename col_qual_list ) | 'ADD' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DEFAULT' a_expr | 'DROP' 'DEFAULT' ) | 'ALTER' ( 'COLUMN' | ) column_name alter_column_on_update | 'ALTER' ( 'COLUMN' | ) column_name alter_column_visible | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | 'ALTER' ( 'COLUMN' | ) column_name 'SET' 'NOT' 'NULL' | 'DROP' ( 'COLUMN' | ) 'IF' 'EXISTS' column_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' ( 'COLUMN' | ) column_name ( 'CASCADE' | 'RESTRICT' | ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DATA' | ) 'TYPE' typename ( 'COLLATE' collation_name | ) ( 'USING' a_expr | ) | 'ADD' ( 'CONSTRAINT' constraint_name constraint_elem | constraint_elem ) | 'ADD' 'CONSTRAINT' 'IF' 'NOT' 'EXISTS' constraint_name constraint_elem | 'ALTER' 'PRIMARY' 'KEY' 'USING' 'COLUMNS' '(' index_params ')' opt_hash_sharded | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' 'CONSTRAINT' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by_table | 'SET' '(' storage_parameter_list ')' | 'RESET' '(' storage_parameter_key_list ')' ) ) ( ( ',' ( 'RENAME' ( 'COLUMN' | ) column_name 'TO' column_name | 'RENAME' 'CONSTRAINT' column_name 'TO' column_name | 'ADD' ( column_name typename col_qual_list ) | 'ADD' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DEFAULT' a_expr | 'DROP' 'DEFAULT' ) | 'ALTER' ( 'COLUMN' | ) column_name alter_column_on_update | 'ALTER' ( 'COLUMN' | ) column_name alter_column_visible | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | 'ALTER' ( 'COLUMN' | ) column_name 'SET' 'NOT' 'NULL' | 'DROP' ( 'COLUMN' | ) 'IF' 'EXISTS' column_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' ( 'COLUMN' | ) column_name ( 'CASCADE' | 'RESTRICT' | ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DATA' | ) 'TYPE' typename ( 'COLLATE' collation_name | ) ( 'USING' a_expr | ) | 'ADD' ( 'CONSTRAINT' constraint_name constraint_elem | constraint_elem ) | 'ADD' 'CONSTRAINT' 'IF' 'NOT' 'EXISTS' constraint_name constraint_elem | 'ALTER' 'PRIMARY' 'KEY' 'USING' 'COLUMNS' '(' index_params ')' opt_hash_sharded | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' 'CONSTRAINT' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by_table | 'SET' '(' storage_parameter_list ')' | 'RESET' '(' storage_parameter_key_list ')' ) ) )* ) + | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name ( ( ( 'RENAME' ( 'COLUMN' | ) column_name 'TO' column_name | 'RENAME' 'CONSTRAINT' column_name 'TO' column_name | 'ADD' ( column_name typename col_qual_list ) | 'ADD' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DEFAULT' a_expr | 'DROP' 'DEFAULT' ) | 'ALTER' ( 'COLUMN' | ) column_name alter_column_on_update | 'ALTER' ( 'COLUMN' | ) column_name alter_column_visible | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | 'ALTER' ( 'COLUMN' | ) column_name 'SET' 'NOT' 'NULL' | 'DROP' ( 'COLUMN' | ) 'IF' 'EXISTS' column_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' ( 'COLUMN' | ) column_name ( 'CASCADE' | 'RESTRICT' | ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DATA' | ) 'TYPE' typename ( 'COLLATE' collation_name | ) ( 'USING' a_expr | ) | 'ADD' ( 'CONSTRAINT' constraint_name constraint_elem | constraint_elem ) | 'ADD' 'CONSTRAINT' 'IF' 'NOT' 'EXISTS' constraint_name constraint_elem | 'ALTER' 'PRIMARY' 'KEY' 'USING' 'COLUMNS' '(' index_params ')' opt_hash_sharded | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' 'CONSTRAINT' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by_table | 'SET' '(' storage_parameter_list ')' | 'RESET' '(' storage_parameter_key_list ')' ) ) ( ( ',' ( 'RENAME' ( 'COLUMN' | ) column_name 'TO' column_name | 'RENAME' 'CONSTRAINT' column_name 'TO' column_name | 'ADD' ( column_name typename col_qual_list ) | 'ADD' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DEFAULT' a_expr | 'DROP' 'DEFAULT' ) | 'ALTER' ( 'COLUMN' | ) column_name alter_column_on_update | 'ALTER' ( 'COLUMN' | ) column_name alter_column_visible | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | 'ALTER' ( 'COLUMN' | ) column_name 'SET' 'NOT' 'NULL' | 'DROP' ( 'COLUMN' | ) 'IF' 'EXISTS' column_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' ( 'COLUMN' | ) column_name ( 'CASCADE' | 'RESTRICT' | ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DATA' | ) 'TYPE' typename ( 'COLLATE' collation_name | ) ( 'USING' a_expr | ) | 'ADD' ( 'CONSTRAINT' constraint_name constraint_elem | constraint_elem ) | 'ADD' 'CONSTRAINT' 'IF' 'NOT' 'EXISTS' constraint_name constraint_elem | 'ALTER' 'PRIMARY' 'KEY' 'USING' 'COLUMNS' '(' index_params ')' opt_hash_sharded | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' 'CONSTRAINT' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by_table | 'SET' '(' storage_parameter_list ')' | 'RESET' '(' storage_parameter_key_list ')' ) ) )* ) diff --git a/docs/generated/sql/bnf/alter_table_partition_by.bnf b/docs/generated/sql/bnf/alter_table_partition_by.bnf index b844074b64f4..be4913e668ad 100644 --- a/docs/generated/sql/bnf/alter_table_partition_by.bnf +++ b/docs/generated/sql/bnf/alter_table_partition_by.bnf @@ -1,3 +1,3 @@ alter_onetable_stmt ::= - 'ALTER' 'TABLE' table_name 'PARTITION' 'ALL' 'BY' partition_by_inner ( ( ',' ( 'RENAME' opt_column column_name 'TO' column_name | 'RENAME' 'CONSTRAINT' column_name 'TO' column_name | 'ADD' column_def | 'ADD' 'IF' 'NOT' 'EXISTS' column_def | 'ADD' 'COLUMN' column_def | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' column_def | 'ALTER' opt_column column_name alter_column_default | 'ALTER' opt_column column_name alter_column_on_update | 'ALTER' opt_column column_name alter_column_visible | 'ALTER' opt_column column_name 'DROP' 'NOT' 'NULL' | 'ALTER' opt_column column_name 'DROP' 'STORED' | 'ALTER' opt_column column_name 'SET' 'NOT' 'NULL' | 'DROP' opt_column 'IF' 'EXISTS' column_name opt_drop_behavior | 'DROP' opt_column column_name opt_drop_behavior | 'ALTER' opt_column column_name opt_set_data 'TYPE' typename opt_collate opt_alter_column_using | 'ADD' table_constraint opt_validate_behavior | 'ADD' 'CONSTRAINT' 'IF' 'NOT' 'EXISTS' constraint_name constraint_elem opt_validate_behavior | 'ALTER' 'PRIMARY' 'KEY' 'USING' 'COLUMNS' '(' index_params ')' opt_hash_sharded | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name opt_drop_behavior | 'DROP' 'CONSTRAINT' constraint_name opt_drop_behavior | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | ( partition_by | 'PARTITION' 'ALL' 'BY' partition_by_inner ) | 'SET' '(' storage_parameter_list ')' ) ) )* - | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'PARTITION' 'ALL' 'BY' partition_by_inner ( ( ',' ( 'RENAME' opt_column column_name 'TO' column_name | 'RENAME' 'CONSTRAINT' column_name 'TO' column_name | 'ADD' column_def | 'ADD' 'IF' 'NOT' 'EXISTS' column_def | 'ADD' 'COLUMN' column_def | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' column_def | 'ALTER' opt_column column_name alter_column_default | 'ALTER' opt_column column_name alter_column_on_update | 'ALTER' opt_column column_name alter_column_visible | 'ALTER' opt_column column_name 'DROP' 'NOT' 'NULL' | 'ALTER' opt_column column_name 'DROP' 'STORED' | 'ALTER' opt_column column_name 'SET' 'NOT' 'NULL' | 'DROP' opt_column 'IF' 'EXISTS' column_name opt_drop_behavior | 'DROP' opt_column column_name opt_drop_behavior | 'ALTER' opt_column column_name opt_set_data 'TYPE' typename opt_collate opt_alter_column_using | 'ADD' table_constraint opt_validate_behavior | 'ADD' 'CONSTRAINT' 'IF' 'NOT' 'EXISTS' constraint_name constraint_elem opt_validate_behavior | 'ALTER' 'PRIMARY' 'KEY' 'USING' 'COLUMNS' '(' index_params ')' opt_hash_sharded | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name opt_drop_behavior | 'DROP' 'CONSTRAINT' constraint_name opt_drop_behavior | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | ( partition_by | 'PARTITION' 'ALL' 'BY' partition_by_inner ) | 'SET' '(' storage_parameter_list ')' ) ) )* + 'ALTER' 'TABLE' table_name 'PARTITION' 'ALL' 'BY' partition_by_inner ( ( ',' ( 'RENAME' opt_column column_name 'TO' column_name | 'RENAME' 'CONSTRAINT' column_name 'TO' column_name | 'ADD' column_def | 'ADD' 'IF' 'NOT' 'EXISTS' column_def | 'ADD' 'COLUMN' column_def | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' column_def | 'ALTER' opt_column column_name alter_column_default | 'ALTER' opt_column column_name alter_column_on_update | 'ALTER' opt_column column_name alter_column_visible | 'ALTER' opt_column column_name 'DROP' 'NOT' 'NULL' | 'ALTER' opt_column column_name 'DROP' 'STORED' | 'ALTER' opt_column column_name 'SET' 'NOT' 'NULL' | 'DROP' opt_column 'IF' 'EXISTS' column_name opt_drop_behavior | 'DROP' opt_column column_name opt_drop_behavior | 'ALTER' opt_column column_name opt_set_data 'TYPE' typename opt_collate opt_alter_column_using | 'ADD' table_constraint opt_validate_behavior | 'ADD' 'CONSTRAINT' 'IF' 'NOT' 'EXISTS' constraint_name constraint_elem opt_validate_behavior | 'ALTER' 'PRIMARY' 'KEY' 'USING' 'COLUMNS' '(' index_params ')' opt_hash_sharded | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name opt_drop_behavior | 'DROP' 'CONSTRAINT' constraint_name opt_drop_behavior | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | ( partition_by | 'PARTITION' 'ALL' 'BY' partition_by_inner ) | 'SET' '(' storage_parameter_list ')' | 'RESET' '(' storage_parameter_key_list ')' ) ) )* + | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'PARTITION' 'ALL' 'BY' partition_by_inner ( ( ',' ( 'RENAME' opt_column column_name 'TO' column_name | 'RENAME' 'CONSTRAINT' column_name 'TO' column_name | 'ADD' column_def | 'ADD' 'IF' 'NOT' 'EXISTS' column_def | 'ADD' 'COLUMN' column_def | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' column_def | 'ALTER' opt_column column_name alter_column_default | 'ALTER' opt_column column_name alter_column_on_update | 'ALTER' opt_column column_name alter_column_visible | 'ALTER' opt_column column_name 'DROP' 'NOT' 'NULL' | 'ALTER' opt_column column_name 'DROP' 'STORED' | 'ALTER' opt_column column_name 'SET' 'NOT' 'NULL' | 'DROP' opt_column 'IF' 'EXISTS' column_name opt_drop_behavior | 'DROP' opt_column column_name opt_drop_behavior | 'ALTER' opt_column column_name opt_set_data 'TYPE' typename opt_collate opt_alter_column_using | 'ADD' table_constraint opt_validate_behavior | 'ADD' 'CONSTRAINT' 'IF' 'NOT' 'EXISTS' constraint_name constraint_elem opt_validate_behavior | 'ALTER' 'PRIMARY' 'KEY' 'USING' 'COLUMNS' '(' index_params ')' opt_hash_sharded | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name opt_drop_behavior | 'DROP' 'CONSTRAINT' constraint_name opt_drop_behavior | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | ( partition_by | 'PARTITION' 'ALL' 'BY' partition_by_inner ) | 'SET' '(' storage_parameter_list ')' | 'RESET' '(' storage_parameter_key_list ')' ) ) )* diff --git a/docs/generated/sql/bnf/stmt_block.bnf b/docs/generated/sql/bnf/stmt_block.bnf index 786f6ace7910..d5df68b66665 100644 --- a/docs/generated/sql/bnf/stmt_block.bnf +++ b/docs/generated/sql/bnf/stmt_block.bnf @@ -2689,6 +2689,7 @@ alter_table_cmd ::= | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by_table | 'SET' '(' storage_parameter_list ')' + | 'RESET' '(' storage_parameter_key_list ')' var_set_list ::= ( var_name '=' 'COPY' 'FROM' 'PARENT' | var_name '=' var_value ) ( ( ',' var_name '=' var_value | ',' var_name '=' 'COPY' 'FROM' 'PARENT' ) )* @@ -2783,8 +2784,7 @@ partition_by_inner ::= | 'NOTHING' storage_parameter ::= - name '=' var_value - | 'SCONST' '=' var_value + storage_parameter_key '=' var_value table_elem ::= column_def @@ -2983,6 +2983,9 @@ audit_mode ::= 'READ' 'WRITE' | 'OFF' +storage_parameter_key_list ::= + ( storage_parameter_key ) ( ( ',' storage_parameter_key ) )* + partition_by_index ::= partition_by @@ -3070,6 +3073,10 @@ list_partitions ::= range_partitions ::= ( range_partition ) ( ( ',' range_partition ) )* +storage_parameter_key ::= + name + | 'SCONST' + index_def ::= 'INDEX' opt_index_name '(' index_params ')' opt_hash_sharded opt_storing opt_partition_by_index opt_with_storage_parameter_list opt_where_clause | 'UNIQUE' 'INDEX' opt_index_name '(' index_params ')' opt_hash_sharded opt_storing opt_partition_by_index opt_with_storage_parameter_list opt_where_clause diff --git a/pkg/sql/alter_table.go b/pkg/sql/alter_table.go index cbdae68ef64a..da4b897a340d 100644 --- a/pkg/sql/alter_table.go +++ b/pkg/sql/alter_table.go @@ -968,7 +968,7 @@ func (n *alterTableNode) startExec(params runParams) error { } case *tree.AlterTableSetStorageParams: - if err := paramparse.ApplyStorageParameters( + if err := paramparse.SetStorageParameters( params.ctx, params.p.SemaCtx(), params.EvalContext(), @@ -978,6 +978,16 @@ func (n *alterTableNode) startExec(params runParams) error { return err } + case *tree.AlterTableResetStorageParams: + if err := paramparse.ResetStorageParameters( + params.ctx, + params.EvalContext(), + t.Params, + ¶mparse.TableStorageParamObserver{}, + ); err != nil { + return err + } + case *tree.AlterTableRenameColumn: descChanged, err := params.p.renameColumn(params.ctx, n.tableDesc, t.Column, t.NewName) if err != nil { diff --git a/pkg/sql/create_index.go b/pkg/sql/create_index.go index bece9f5ffd99..ff9a700c7076 100644 --- a/pkg/sql/create_index.go +++ b/pkg/sql/create_index.go @@ -262,7 +262,7 @@ func makeIndexDescriptor( return nil, err } - if err := paramparse.ApplyStorageParameters( + if err := paramparse.SetStorageParameters( params.ctx, params.p.SemaCtx(), params.EvalContext(), diff --git a/pkg/sql/create_table.go b/pkg/sql/create_table.go index fb6048d7202d..f3edff38f7df 100644 --- a/pkg/sql/create_table.go +++ b/pkg/sql/create_table.go @@ -1270,7 +1270,7 @@ func NewTableDesc( id, dbID, sc.GetID(), n.Table.Table(), creationTime, privileges, persistence, ) - if err := paramparse.ApplyStorageParameters( + if err := paramparse.SetStorageParameters( ctx, semaCtx, evalCtx, @@ -1775,7 +1775,7 @@ func NewTableDesc( } idx.Predicate = expr } - if err := paramparse.ApplyStorageParameters( + if err := paramparse.SetStorageParameters( ctx, semaCtx, evalCtx, diff --git a/pkg/sql/logictest/testdata/logic_test/alter_table b/pkg/sql/logictest/testdata/logic_test/alter_table index 0fb34d778572..102065d17748 100644 --- a/pkg/sql/logictest/testdata/logic_test/alter_table +++ b/pkg/sql/logictest/testdata/logic_test/alter_table @@ -2172,6 +2172,12 @@ NOTICE: storage parameter "autovacuum_enabled = 'off'" is ignored statement error parameter "autovacuum_enabled" requires a Boolean value ALTER TABLE storage_param_table SET (autovacuum_enabled='11') +statement error pgcode 22023 invalid storage parameter "foo" +ALTER TABLE storage_param_table RESET (foo) + +statement ok +ALTER TABLE storage_param_table RESET (fillfactor, toast_tuple_target) + # Fixes issue 75154 when dropping and re-creating a constraint in a transaction # we incorrectly detected the primary index as being used, even if its dropped # inside the transaction. The primary index will still exist, but will be diff --git a/pkg/sql/paramparse/paramobserver.go b/pkg/sql/paramparse/paramobserver.go index 9b5b524bdc6d..fca365540bb9 100644 --- a/pkg/sql/paramparse/paramobserver.go +++ b/pkg/sql/paramparse/paramobserver.go @@ -24,9 +24,9 @@ import ( "github.com/cockroachdb/errors" ) -// ApplyStorageParameters applies given storage parameters with the +// SetStorageParameters sets the given storage parameters using the // given observer. -func ApplyStorageParameters( +func SetStorageParameters( ctx context.Context, semaCtx *tree.SemaContext, evalCtx *tree.EvalContext, @@ -55,18 +55,40 @@ func ApplyStorageParameters( return err } - // Apply the param. - if err := paramObserver.Apply(evalCtx, key, datum); err != nil { + if err := paramObserver.onSet(evalCtx, key, datum); err != nil { return err } } - return paramObserver.RunPostChecks() + return paramObserver.runPostChecks() +} + +// ResetStorageParameters sets the given storage parameters using the +// given observer. +func ResetStorageParameters( + ctx context.Context, + evalCtx *tree.EvalContext, + params tree.NameList, + paramObserver StorageParamObserver, +) error { + for _, p := range params { + if err := paramObserver.onReset(evalCtx, string(p)); err != nil { + return err + } + } + return paramObserver.runPostChecks() } // StorageParamObserver applies a storage parameter to an underlying item. type StorageParamObserver interface { - Apply(evalCtx *tree.EvalContext, key string, datum tree.Datum) error - RunPostChecks() error + // onSet is called during CREATE [TABLE | INDEX] ... WITH (...) or + // ALTER [TABLE | INDEX] ... WITH (...). + onSet(evalCtx *tree.EvalContext, key string, datum tree.Datum) error + // onReset is called during ALTER [TABLE | INDEX] ... RESET (...) + onReset(evalCtx *tree.EvalContext, key string) error + // runPostChecks is called after all storage parameters have been set. + // This allows checking whether multiple storage parameters together + // form a valid configuration. + runPostChecks() error } // TableStorageParamObserver observes storage parameters for tables. @@ -74,57 +96,59 @@ type TableStorageParamObserver struct{} var _ StorageParamObserver = (*TableStorageParamObserver)(nil) -func applyFillFactorStorageParam(evalCtx *tree.EvalContext, key string, datum tree.Datum) error { - val, err := DatumAsFloat(evalCtx, key, datum) - if err != nil { - return err - } - if val < 0 || val > 100 { - return pgerror.Newf(pgcode.InvalidParameterValue, "%q must be between 0 and 100", key) - } - if evalCtx != nil { - evalCtx.ClientNoticeSender.BufferClientNotice( - evalCtx.Context, - pgnotice.Newf("storage parameter %q is ignored", key), - ) - } +// runPostChecks implements the StorageParamObserver interface. +func (po *TableStorageParamObserver) runPostChecks() error { return nil } -// RunPostChecks implements the StorageParamObserver interface. -func (a *TableStorageParamObserver) RunPostChecks() error { - return nil +type tableParam struct { + onSet func(po *TableStorageParamObserver, evalCtx *tree.EvalContext, key string, datum tree.Datum) error + onReset func(po *TableStorageParamObserver, evalCtx *tree.EvalContext, key string) error } -// Apply implements the StorageParamObserver interface. -func (a *TableStorageParamObserver) Apply( - evalCtx *tree.EvalContext, key string, datum tree.Datum, -) error { - switch key { - case `fillfactor`: - return applyFillFactorStorageParam(evalCtx, key, datum) - case `autovacuum_enabled`: - var boolVal bool - if stringVal, err := DatumAsString(evalCtx, key, datum); err == nil { - boolVal, err = ParseBoolVar(key, stringVal) - if err != nil { - return err +var tableParams = map[string]tableParam{ + `fillfactor`: { + onSet: func(po *TableStorageParamObserver, evalCtx *tree.EvalContext, key string, datum tree.Datum) error { + return setFillFactorStorageParam(evalCtx, key, datum) + }, + onReset: func(po *TableStorageParamObserver, evalCtx *tree.EvalContext, key string) error { + // Operation is a no-op so do nothing. + return nil + }, + }, + `autovacuum_enabled`: { + onSet: func(po *TableStorageParamObserver, evalCtx *tree.EvalContext, key string, datum tree.Datum) error { + var boolVal bool + if stringVal, err := DatumAsString(evalCtx, key, datum); err == nil { + boolVal, err = ParseBoolVar(key, stringVal) + if err != nil { + return err + } + } else { + s, err := GetSingleBool(key, datum) + if err != nil { + return err + } + boolVal = bool(*s) } - } else { - s, err := GetSingleBool(key, datum) - if err != nil { - return err + if !boolVal && evalCtx != nil { + evalCtx.ClientNoticeSender.BufferClientNotice( + evalCtx.Context, + pgnotice.Newf(`storage parameter "%s = %s" is ignored`, key, datum.String()), + ) } - boolVal = bool(*s) - } - if !boolVal && evalCtx != nil { - evalCtx.ClientNoticeSender.BufferClientNotice( - evalCtx.Context, - pgnotice.Newf(`storage parameter "%s = %s" is ignored`, key, datum.String()), - ) - } - return nil - case `toast_tuple_target`, + return nil + }, + onReset: func(po *TableStorageParamObserver, evalCtx *tree.EvalContext, key string) error { + // Operation is a no-op so do nothing. + return nil + }, + }, +} + +func init() { + for _, param := range []string{ + `toast_tuple_target`, `parallel_workers`, `toast.autovacuum_enabled`, `autovacuum_vacuum_threshold`, @@ -150,12 +174,54 @@ func (a *TableStorageParamObserver) Apply( `toast.autovacuum_multixact_freeze_table_age`, `log_autovacuum_min_duration`, `toast.log_autovacuum_min_duration`, - `user_catalog_table`: - return unimplemented.NewWithIssuef(43299, "storage parameter %q", key) + `user_catalog_table`, + } { + tableParams[param] = tableParam{ + onSet: func(po *TableStorageParamObserver, evalCtx *tree.EvalContext, key string, datum tree.Datum) error { + return unimplemented.NewWithIssuef(43299, "storage parameter %q", key) + }, + onReset: func(po *TableStorageParamObserver, evalCtx *tree.EvalContext, key string) error { + return nil + }, + } + } +} + +// onSet implements the StorageParamObserver interface. +func (po *TableStorageParamObserver) onSet( + evalCtx *tree.EvalContext, key string, datum tree.Datum, +) error { + if p, ok := tableParams[key]; ok { + return p.onSet(po, evalCtx, key, datum) + } + return pgerror.Newf(pgcode.InvalidParameterValue, "invalid storage parameter %q", key) +} + +// onReset implements the StorageParamObserver interface. +func (po *TableStorageParamObserver) onReset(evalCtx *tree.EvalContext, key string) error { + if p, ok := tableParams[key]; ok { + return p.onReset(po, evalCtx, key) } return pgerror.Newf(pgcode.InvalidParameterValue, "invalid storage parameter %q", key) } +func setFillFactorStorageParam(evalCtx *tree.EvalContext, key string, datum tree.Datum) error { + val, err := DatumAsFloat(evalCtx, key, datum) + if err != nil { + return err + } + if val < 0 || val > 100 { + return pgerror.Newf(pgcode.InvalidParameterValue, "%q must be between 0 and 100", key) + } + if evalCtx != nil { + evalCtx.ClientNoticeSender.BufferClientNotice( + evalCtx.Context, + pgnotice.Newf("storage parameter %q is ignored", key), + ) + } + return nil +} + // IndexStorageParamObserver observes storage parameters for indexes. type IndexStorageParamObserver struct { IndexDesc *descpb.IndexDescriptor @@ -174,10 +240,10 @@ func getS2ConfigFromIndex(indexDesc *descpb.IndexDescriptor) *geoindex.S2Config return s2Config } -func (a *IndexStorageParamObserver) applyS2ConfigSetting( +func (po *IndexStorageParamObserver) applyS2ConfigSetting( evalCtx *tree.EvalContext, key string, expr tree.Datum, min int64, max int64, ) error { - s2Config := getS2ConfigFromIndex(a.IndexDesc) + s2Config := getS2ConfigFromIndex(po.IndexDesc) if s2Config == nil { return pgerror.Newf( pgcode.InvalidParameterValue, @@ -211,10 +277,10 @@ func (a *IndexStorageParamObserver) applyS2ConfigSetting( return nil } -func (a *IndexStorageParamObserver) applyGeometryIndexSetting( +func (po *IndexStorageParamObserver) applyGeometryIndexSetting( evalCtx *tree.EvalContext, key string, expr tree.Datum, ) error { - if a.IndexDesc.GeoConfig.S2Geometry == nil { + if po.IndexDesc.GeoConfig.S2Geometry == nil { return pgerror.Newf(pgcode.InvalidParameterValue, "%q can only be applied to GEOMETRY spatial indexes", key) } val, err := DatumAsFloat(evalCtx, key, expr) @@ -223,34 +289,34 @@ func (a *IndexStorageParamObserver) applyGeometryIndexSetting( } switch key { case `geometry_min_x`: - a.IndexDesc.GeoConfig.S2Geometry.MinX = val + po.IndexDesc.GeoConfig.S2Geometry.MinX = val case `geometry_max_x`: - a.IndexDesc.GeoConfig.S2Geometry.MaxX = val + po.IndexDesc.GeoConfig.S2Geometry.MaxX = val case `geometry_min_y`: - a.IndexDesc.GeoConfig.S2Geometry.MinY = val + po.IndexDesc.GeoConfig.S2Geometry.MinY = val case `geometry_max_y`: - a.IndexDesc.GeoConfig.S2Geometry.MaxY = val + po.IndexDesc.GeoConfig.S2Geometry.MaxY = val default: return pgerror.Newf(pgcode.InvalidParameterValue, "unknown key: %q", key) } return nil } -// Apply implements the StorageParamObserver interface. -func (a *IndexStorageParamObserver) Apply( +// onSet implements the StorageParamObserver interface. +func (po *IndexStorageParamObserver) onSet( evalCtx *tree.EvalContext, key string, expr tree.Datum, ) error { switch key { case `fillfactor`: - return applyFillFactorStorageParam(evalCtx, key, expr) + return setFillFactorStorageParam(evalCtx, key, expr) case `s2_max_level`: - return a.applyS2ConfigSetting(evalCtx, key, expr, 0, 30) + return po.applyS2ConfigSetting(evalCtx, key, expr, 0, 30) case `s2_level_mod`: - return a.applyS2ConfigSetting(evalCtx, key, expr, 1, 3) + return po.applyS2ConfigSetting(evalCtx, key, expr, 1, 3) case `s2_max_cells`: - return a.applyS2ConfigSetting(evalCtx, key, expr, 1, 32) + return po.applyS2ConfigSetting(evalCtx, key, expr, 1, 32) case `geometry_min_x`, `geometry_max_x`, `geometry_min_y`, `geometry_max_y`: - return a.applyGeometryIndexSetting(evalCtx, key, expr) + return po.applyGeometryIndexSetting(evalCtx, key, expr) case `vacuum_cleanup_index_scale_factor`, `buffering`, `fastupdate`, @@ -262,9 +328,14 @@ func (a *IndexStorageParamObserver) Apply( return pgerror.Newf(pgcode.InvalidParameterValue, "invalid storage parameter %q", key) } -// RunPostChecks implements the StorageParamObserver interface. -func (a *IndexStorageParamObserver) RunPostChecks() error { - s2Config := getS2ConfigFromIndex(a.IndexDesc) +// onReset implements the StorageParameterObserver interface. +func (po *IndexStorageParamObserver) onReset(evalCtx *tree.EvalContext, key string) error { + return errors.AssertionFailedf("non-implemented codepath") +} + +// runPostChecks implements the StorageParamObserver interface. +func (po *IndexStorageParamObserver) runPostChecks() error { + s2Config := getS2ConfigFromIndex(po.IndexDesc) if s2Config != nil { if (s2Config.MaxLevel)%s2Config.LevelMod != 0 { return pgerror.Newf( @@ -276,7 +347,7 @@ func (a *IndexStorageParamObserver) RunPostChecks() error { } } - if cfg := a.IndexDesc.GeoConfig.S2Geometry; cfg != nil { + if cfg := po.IndexDesc.GeoConfig.S2Geometry; cfg != nil { if cfg.MaxX <= cfg.MinX { return pgerror.Newf( pgcode.InvalidParameterValue, diff --git a/pkg/sql/parser/sql.y b/pkg/sql/parser/sql.y index 70dc92efe33f..eaca4853068f 100644 --- a/pkg/sql/parser/sql.y +++ b/pkg/sql/parser/sql.y @@ -393,8 +393,14 @@ func (u *sqlSymUnion) storageParams() []tree.StorageParam { } return nil } +func (u *sqlSymUnion) storageParamKeys() []tree.Name { + if params, ok := u.val.([]tree.Name); ok { + return params + } + return nil +} func (u *sqlSymUnion) persistence() tree.Persistence { - return u.val.(tree.Persistence) + return u.val.(tree.Persistence) } func (u *sqlSymUnion) colType() *types.T { if colType, ok := u.val.(*types.T); ok && colType != nil { @@ -1118,6 +1124,8 @@ func (u *sqlSymUnion) setVar() *tree.SetVar { %type <*tree.RestoreOptions> opt_with_restore_options restore_options restore_options_list %type <*tree.CopyOptions> opt_with_copy_options copy_options copy_options_list %type import_format +%type storage_parameter_key +%type storage_parameter_key_list %type storage_parameter %type <[]tree.StorageParam> storage_parameter_list opt_table_with opt_with_storage_parameter_list @@ -2372,6 +2380,12 @@ alter_table_cmd: StorageParams: $3.storageParams(), } } +| RESET '(' storage_parameter_key_list ')' + { + $$.val = &tree.AlterTableResetStorageParams{ + Params: $3.storageParamKeys(), + } + } audit_mode: READ WRITE { $$.val = tree.AuditModeReadWrite } @@ -6592,12 +6606,22 @@ opt_create_table_on_commit: return unimplementedWithIssueDetail(sqllex, 46556, "drop") } -storage_parameter: - name '=' var_value +storage_parameter_key: + name +| SCONST + +storage_parameter_key_list: + storage_parameter_key { - $$.val = tree.StorageParam{Key: tree.Name($1), Value: $3.expr()} + $$.val = []tree.Name{tree.Name($1)} } -| SCONST '=' var_value +| storage_parameter_key_list ',' storage_parameter_key + { + $$.val = append($1.storageParamKeys(), tree.Name($3)) + } + +storage_parameter: + storage_parameter_key '=' var_value { $$.val = tree.StorageParam{Key: tree.Name($1), Value: $3.expr()} } diff --git a/pkg/sql/parser/testdata/alter_table b/pkg/sql/parser/testdata/alter_table index 935df43de29d..9c2fabd7d270 100644 --- a/pkg/sql/parser/testdata/alter_table +++ b/pkg/sql/parser/testdata/alter_table @@ -1114,6 +1114,22 @@ ALTER TABLE t SET (fillfactor = (100), autovacuum_enabled = (false)) -- fully pa ALTER TABLE t SET (fillfactor = _, autovacuum_enabled = _) -- literals removed ALTER TABLE _ SET (_ = 100, _ = false) -- identifiers removed +parse +ALTER TABLE t RESET (fillfactor) +---- +ALTER TABLE t RESET (fillfactor) +ALTER TABLE t RESET (fillfactor) -- fully parenthesized +ALTER TABLE t RESET (fillfactor) -- literals removed +ALTER TABLE _ RESET (_) -- identifiers removed + +parse +ALTER TABLE t RESET (fillfactor, autovacuum_enabled) +---- +ALTER TABLE t RESET (fillfactor, autovacuum_enabled) +ALTER TABLE t RESET (fillfactor, autovacuum_enabled) -- fully parenthesized +ALTER TABLE t RESET (fillfactor, autovacuum_enabled) -- literals removed +ALTER TABLE _ RESET (_, _) -- identifiers removed + error ALTER PARTITION p OF TABLE tbl@idx CONFIGURE ZONE USING num_replicas = 1 ---- diff --git a/pkg/sql/sem/builtins/geo_builtins.go b/pkg/sql/sem/builtins/geo_builtins.go index e9cb9907affd..2c35adc863ad 100644 --- a/pkg/sql/sem/builtins/geo_builtins.go +++ b/pkg/sql/sem/builtins/geo_builtins.go @@ -7477,7 +7477,7 @@ func applyGeoindexConfigStorageParams( return geoindex.Config{}, errors.Newf("invalid storage parameters specified: %s", params) } semaCtx := tree.MakeSemaContext() - if err := paramparse.ApplyStorageParameters( + if err := paramparse.SetStorageParameters( evalCtx.Context, &semaCtx, evalCtx, diff --git a/pkg/sql/sem/tree/alter_table.go b/pkg/sql/sem/tree/alter_table.go index 45d1493ff119..c614d0185c48 100644 --- a/pkg/sql/sem/tree/alter_table.go +++ b/pkg/sql/sem/tree/alter_table.go @@ -78,6 +78,7 @@ func (*AlterTableValidateConstraint) alterTableCmd() {} func (*AlterTablePartitionByTable) alterTableCmd() {} func (*AlterTableInjectStats) alterTableCmd() {} func (*AlterTableSetStorageParams) alterTableCmd() {} +func (*AlterTableResetStorageParams) alterTableCmd() {} var _ AlterTableCmd = &AlterTableAddColumn{} var _ AlterTableCmd = &AlterTableAddConstraint{} @@ -97,6 +98,7 @@ var _ AlterTableCmd = &AlterTableValidateConstraint{} var _ AlterTableCmd = &AlterTablePartitionByTable{} var _ AlterTableCmd = &AlterTableInjectStats{} var _ AlterTableCmd = &AlterTableSetStorageParams{} +var _ AlterTableCmd = &AlterTableResetStorageParams{} // ColumnMutationCmd is the subset of AlterTableCmds that modify an // existing column. @@ -624,6 +626,24 @@ func (node *AlterTableSetStorageParams) Format(ctx *FmtCtx) { ctx.WriteString(")") } +// AlterTableResetStorageParams represents a ALTER TABLE RESET command. +type AlterTableResetStorageParams struct { + Params NameList +} + +// TelemetryCounter returns the telemetry counter to increment +// when this command is used. +func (node *AlterTableResetStorageParams) TelemetryCounter() telemetry.Counter { + return sqltelemetry.SchemaChangeAlterCounter("set_storage_param") +} + +// Format implements the NodeFormatter interface. +func (node *AlterTableResetStorageParams) Format(ctx *FmtCtx) { + ctx.WriteString(" RESET (") + ctx.FormatNode(&node.Params) + ctx.WriteString(")") +} + // AlterTableLocality represents an ALTER TABLE LOCALITY command. type AlterTableLocality struct { Name *UnresolvedObjectName