diff --git a/docs/generated/sql/bnf/alter_column.bnf b/docs/generated/sql/bnf/alter_column.bnf index 1046df0d371e..358240bb3b28 100644 --- a/docs/generated/sql/bnf/alter_column.bnf +++ b/docs/generated/sql/bnf/alter_column.bnf @@ -3,6 +3,10 @@ alter_onetable_stmt ::= | 'ALTER' 'TABLE' table_name 'ALTER' 'COLUMN' column_name 'DROP' 'DEFAULT' | 'ALTER' 'TABLE' table_name 'ALTER' column_name 'SET' 'DEFAULT' a_expr | 'ALTER' 'TABLE' table_name 'ALTER' column_name 'DROP' 'DEFAULT' + | 'ALTER' 'TABLE' table_name 'ALTER' 'COLUMN' column_name 'SET' 'NOT' 'VISIBLE' + | 'ALTER' 'TABLE' table_name 'ALTER' column_name 'SET' 'NOT' 'VISIBLE' + | 'ALTER' 'TABLE' table_name 'ALTER' 'COLUMN' column_name 'SET' 'VISIBLE' + | 'ALTER' 'TABLE' table_name 'ALTER' column_name 'SET' 'VISIBLE' | 'ALTER' 'TABLE' table_name 'ALTER' 'COLUMN' column_name 'DROP' 'NOT' 'NULL' | 'ALTER' 'TABLE' table_name 'ALTER' column_name 'DROP' 'NOT' 'NULL' | 'ALTER' 'TABLE' table_name 'ALTER' 'COLUMN' column_name 'DROP' 'STORED' @@ -27,6 +31,10 @@ alter_onetable_stmt ::= | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' 'COLUMN' column_name 'DROP' 'DEFAULT' | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' column_name 'SET' 'DEFAULT' a_expr | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' column_name 'DROP' 'DEFAULT' + | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' 'COLUMN' column_name 'SET' 'NOT' 'VISIBLE' + | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' column_name 'SET' 'NOT' 'VISIBLE' + | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' 'COLUMN' column_name 'SET' 'VISIBLE' + | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' column_name 'SET' 'VISIBLE' | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' 'COLUMN' column_name 'DROP' 'NOT' 'NULL' | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' column_name 'DROP' 'NOT' 'NULL' | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' 'COLUMN' column_name 'DROP' 'STORED' diff --git a/docs/generated/sql/bnf/alter_table.bnf b/docs/generated/sql/bnf/alter_table.bnf index 7f6bc5c4de66..94b387724f65 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 ( ( ( '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 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | '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 ) | '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 | 'INJECT' 'STATISTICS' a_expr ) ) ( ( ',' ( '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 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | '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 ) | '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 | 'INJECT' 'STATISTICS' a_expr ) ) )* ) - | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_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 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | '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 ) | '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 | 'INJECT' 'STATISTICS' a_expr ) ) ( ( ',' ( '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 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | '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 ) | '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 | 'INJECT' 'STATISTICS' a_expr ) ) )* ) + 'ALTER' 'TABLE' table_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 'SET' 'NOT' 'VISIBLE' | 'ALTER' ( 'COLUMN' | ) column_name 'SET' 'VISIBLE' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | '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 ) | '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 | 'INJECT' 'STATISTICS' a_expr ) ) ( ( ',' ( '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 'SET' 'NOT' 'VISIBLE' | 'ALTER' ( 'COLUMN' | ) column_name 'SET' 'VISIBLE' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | '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 ) | '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 | 'INJECT' 'STATISTICS' a_expr ) ) )* ) + | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_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 'SET' 'NOT' 'VISIBLE' | 'ALTER' ( 'COLUMN' | ) column_name 'SET' 'VISIBLE' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | '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 ) | '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 | 'INJECT' 'STATISTICS' a_expr ) ) ( ( ',' ( '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 'SET' 'NOT' 'VISIBLE' | 'ALTER' ( 'COLUMN' | ) column_name 'SET' 'VISIBLE' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | '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 ) | '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 | 'INJECT' 'STATISTICS' a_expr ) ) )* ) diff --git a/docs/generated/sql/bnf/col_qualification.bnf b/docs/generated/sql/bnf/col_qualification.bnf index 053f879a2f71..55c64288333c 100644 --- a/docs/generated/sql/bnf/col_qualification.bnf +++ b/docs/generated/sql/bnf/col_qualification.bnf @@ -7,6 +7,7 @@ col_qualification ::= | 'CONSTRAINT' constraint_name 'DEFAULT' b_expr | 'CONSTRAINT' constraint_name 'REFERENCES' table_name opt_name_parens reference_actions | 'CONSTRAINT' constraint_name 'AS' '(' a_expr ')' 'STORED' + | 'CONSTRAINT' constraint_name 'NOT' 'VISIBLE' | 'NOT' 'NULL' | 'NULL' | 'UNIQUE' @@ -15,6 +16,7 @@ col_qualification ::= | 'DEFAULT' b_expr | 'REFERENCES' table_name opt_name_parens reference_actions | 'AS' '(' a_expr ')' 'STORED' + | 'NOT' 'VISIBLE' | 'COLLATE' collation_name | 'FAMILY' family_name | 'CREATE' 'FAMILY' family_name diff --git a/docs/generated/sql/bnf/stmt_block.bnf b/docs/generated/sql/bnf/stmt_block.bnf index 1edc552d596b..c75a048c64a8 100644 --- a/docs/generated/sql/bnf/stmt_block.bnf +++ b/docs/generated/sql/bnf/stmt_block.bnf @@ -842,6 +842,7 @@ unreserved_keyword ::= | 'VALIDATE' | 'VALUE' | 'VARYING' + | 'VISIBLE' | 'WITHIN' | 'WITHOUT' | 'WRITE' @@ -1769,6 +1770,8 @@ alter_table_cmd ::= | 'ADD' 'COLUMN' column_def | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' column_def | 'ALTER' opt_column column_name alter_column_default + | 'ALTER' opt_column column_name 'SET' 'NOT' 'VISIBLE' + | 'ALTER' opt_column column_name 'SET' 'VISIBLE' | 'ALTER' opt_column column_name 'DROP' 'NOT' 'NULL' | 'ALTER' opt_column column_name 'DROP' 'STORED' | 'DROP' opt_column 'IF' 'EXISTS' column_name opt_drop_behavior @@ -1991,6 +1994,7 @@ col_qualification_elem ::= | 'DEFAULT' b_expr | 'REFERENCES' table_name opt_name_parens reference_actions | 'AS' '(' a_expr ')' 'STORED' + | 'NOT' 'VISIBLE' family_name ::= name diff --git a/pkg/cli/dump_test.go b/pkg/cli/dump_test.go index 99554a6758dc..7b58138e89b2 100644 --- a/pkg/cli/dump_test.go +++ b/pkg/cli/dump_test.go @@ -390,6 +390,8 @@ func TestDumpAsOf(t *testing.T) { const want1 = `dump d t CREATE TABLE t ( i INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), FAMILY "primary" (i, rowid) ); @@ -412,7 +414,9 @@ INSERT INTO t (i) VALUES const want2 = `dump d t CREATE TABLE t ( i INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), j INT NULL DEFAULT 2:::INT, + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), FAMILY "primary" (i, rowid, j) ); diff --git a/pkg/cli/testdata/dump/flags b/pkg/cli/testdata/dump/flags index b728501b5ed1..90cb96ea3e0f 100644 --- a/pkg/cli/testdata/dump/flags +++ b/pkg/cli/testdata/dump/flags @@ -11,6 +11,8 @@ dump t f --dump-mode=both CREATE TABLE f ( x INT NULL, y INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), FAMILY "primary" (x, y, rowid) ); @@ -24,6 +26,8 @@ dump t f --dump-mode=schema CREATE TABLE f ( x INT NULL, y INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), FAMILY "primary" (x, y, rowid) ); diff --git a/pkg/cli/testdata/dump/identifiers b/pkg/cli/testdata/dump/identifiers index c2192ddef9ad..763c6ef0368a 100644 --- a/pkg/cli/testdata/dump/identifiers +++ b/pkg/cli/testdata/dump/identifiers @@ -13,6 +13,8 @@ dump d ---- CREATE TABLE ";" ( ";" INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), INDEX ";_;_idx" (";" ASC), FAMILY "primary" (";", rowid) ); diff --git a/pkg/cli/testdata/dump/inverted_index b/pkg/cli/testdata/dump/inverted_index index e4bbf1c89775..48da8948a4a2 100644 --- a/pkg/cli/testdata/dump/inverted_index +++ b/pkg/cli/testdata/dump/inverted_index @@ -18,6 +18,8 @@ dump d t CREATE TABLE t ( a JSON NULL, b JSON NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), INVERTED INDEX idx (a), INVERTED INDEX idx2 (b), FAMILY "primary" (a, b, rowid) diff --git a/pkg/cli/testdata/dump/multiple b/pkg/cli/testdata/dump/multiple index c8b1939fdc9f..bc9129a7e2d0 100644 --- a/pkg/cli/testdata/dump/multiple +++ b/pkg/cli/testdata/dump/multiple @@ -13,12 +13,16 @@ dump t f g CREATE TABLE f ( x INT NULL, y INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), FAMILY "primary" (x, y, rowid) ); CREATE TABLE g ( x INT NULL, y INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), FAMILY "primary" (x, y, rowid) ); @@ -36,12 +40,16 @@ dump t CREATE TABLE f ( x INT NULL, y INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), FAMILY "primary" (x, y, rowid) ); CREATE TABLE g ( x INT NULL, y INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), FAMILY "primary" (x, y, rowid) ); diff --git a/pkg/cli/testdata/dump/reference_order b/pkg/cli/testdata/dump/reference_order index 419681a3e4ad..9971c457fbb5 100644 --- a/pkg/cli/testdata/dump/reference_order +++ b/pkg/cli/testdata/dump/reference_order @@ -43,6 +43,8 @@ CREATE TABLE b ( CREATE TABLE a ( i INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), INDEX a_auto_index_fk_i_ref_b (i ASC), FAMILY "primary" (i, rowid) ); @@ -79,6 +81,8 @@ CREATE TABLE d ( CREATE TABLE c ( i INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), INDEX c_auto_index_fk_i_ref_d (i ASC), FAMILY "primary" (i, rowid) ); diff --git a/pkg/cli/testdata/dump/row b/pkg/cli/testdata/dump/row index db7784081367..f8b63eb376f1 100644 --- a/pkg/cli/testdata/dump/row +++ b/pkg/cli/testdata/dump/row @@ -77,6 +77,8 @@ CREATE TABLE t ( e1 DECIMAL(2) NULL, e2 DECIMAL(2,1) NULL, s1 STRING(1) NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), FAMILY "primary" (i, f, d, t, ts, n, o, u, ip, j, ary, tz, e1, e2, s1, rowid), FAMILY fam_1_s (s), FAMILY fam_2_b (b), @@ -91,4 +93,3 @@ INSERT INTO t (i, f, s, b, d, t, ts, n, o, e, u, ip, j, ary, tz, e1, e2, s1) VAL (NULL, 'NaN', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'NaN', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); ---- ---- - diff --git a/pkg/sql/alter_table.go b/pkg/sql/alter_table.go index 4c6bd5e6ce28..657696919711 100644 --- a/pkg/sql/alter_table.go +++ b/pkg/sql/alter_table.go @@ -567,6 +567,20 @@ func (n *alterTableNode) startExec(params runParams) error { return err } + case *tree.AlterTableSetHidden: + col, dropped, err := n.tableDesc.FindColumnByName(t.GetColumn()) + if err != nil { + return err + } + if dropped { + return fmt.Errorf("column %q in the middle of being dropped", t.GetColumn()) + } + if err := applyColumnMutation(n.tableDesc, &col, t, params); err != nil { + return err + } + n.tableDesc.UpdateColumnDescriptor(col) + descriptorChanged = true + case *tree.AlterTableInjectStats: sd, ok := n.statsData[i] if !ok { @@ -757,6 +771,9 @@ func applyColumnMutation( case *tree.AlterTableDropStored: col.ComputeExpr = nil + + case *tree.AlterTableSetHidden: + col.Hidden = t.Hidden } return nil } diff --git a/pkg/sql/create_table.go b/pkg/sql/create_table.go index eb0f0b010262..89e58ffbad23 100644 --- a/pkg/sql/create_table.go +++ b/pkg/sql/create_table.go @@ -921,7 +921,11 @@ func makeTableDescIfAs( if err != nil { return desc, err } - columnTableDef := tree.ColumnTableDef{Name: tree.Name(colRes.Name), Type: colType} + columnTableDef := tree.ColumnTableDef{ + Name: tree.Name(colRes.Name), + Hidden: colRes.Hidden, + Type: colType, + } columnTableDef.Nullable.Nullability = tree.SilentNull if len(p.AsColumnNames) > i { columnTableDef.Name = p.AsColumnNames[i] diff --git a/pkg/sql/create_view.go b/pkg/sql/create_view.go index 4cd953dc0e76..5cac0475c345 100644 --- a/pkg/sql/create_view.go +++ b/pkg/sql/create_view.go @@ -224,7 +224,11 @@ func (n *createViewNode) makeViewTableDesc( if err != nil { return desc, err } - columnTableDef := tree.ColumnTableDef{Name: tree.Name(colRes.Name), Type: colType} + columnTableDef := tree.ColumnTableDef{ + Name: tree.Name(colRes.Name), + Hidden: colRes.Hidden, + Type: colType, + } if len(columnNames) > i { columnTableDef.Name = columnNames[i] } diff --git a/pkg/sql/insert.go b/pkg/sql/insert.go index a48faff6b6b1..3385e3af4d04 100644 --- a/pkg/sql/insert.go +++ b/pkg/sql/insert.go @@ -638,8 +638,7 @@ func (p *planner) processColumns( if ensureColumns { // VisibleColumns is used here to prevent INSERT INTO VALUES (...) // (as opposed to INSERT INTO
(...) VALUES (...)) from writing - // hidden columns. At present, the only hidden column is the implicit rowid - // primary key column. + // hidden columns. return tableDesc.VisibleColumns(), nil } return nil, nil diff --git a/pkg/sql/logictest/testdata/logic_test/alias_types b/pkg/sql/logictest/testdata/logic_test/alias_types index 5780f8b14f06..2cce2d4bf3d6 100644 --- a/pkg/sql/logictest/testdata/logic_test/alias_types +++ b/pkg/sql/logictest/testdata/logic_test/alias_types @@ -13,11 +13,13 @@ SHOW CREATE TABLE aliases ---- Table CreateTable aliases CREATE TABLE aliases ( - a OID NULL, - b NAME NULL, - FAMILY "primary" (a, rowid), - FAMILY fam_1_b (b) - ) + a OID NULL, + b NAME NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + FAMILY "primary" (a, rowid), + FAMILY fam_1_b (b) +) statement ok INSERT INTO aliases VALUES (100, 'abc') diff --git a/pkg/sql/logictest/testdata/logic_test/array b/pkg/sql/logictest/testdata/logic_test/array index 4270b725ac22..749bbb09ecfd 100644 --- a/pkg/sql/logictest/testdata/logic_test/array +++ b/pkg/sql/logictest/testdata/logic_test/array @@ -381,9 +381,11 @@ query TT SHOW CREATE TABLE a ---- a CREATE TABLE a ( - b INT[] NULL, - FAMILY "primary" (b, rowid) - ) + b INT[] NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + FAMILY "primary" (b, rowid) +) statement ok DROP TABLE a @@ -452,9 +454,11 @@ query TT SHOW CREATE TABLE a ---- a CREATE TABLE a ( - b INT[] NULL, - FAMILY "primary" (b, rowid) - ) + b INT[] NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + FAMILY "primary" (b, rowid) +) statement error could not parse "foo" as type int INSERT INTO a VALUES (ARRAY['foo']) @@ -523,9 +527,11 @@ query TT SHOW CREATE TABLE a ---- a CREATE TABLE a ( - b SMALLINT[] NULL, - FAMILY "primary" (b, rowid) - ) + b SMALLINT[] NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + FAMILY "primary" (b, rowid) +) statement error integer out of range for type SMALLINT \(column "b"\) INSERT INTO a VALUES (ARRAY[100000]) diff --git a/pkg/sql/logictest/testdata/logic_test/check_constraints b/pkg/sql/logictest/testdata/logic_test/check_constraints index a7eff95742e0..2f321a5892a6 100644 --- a/pkg/sql/logictest/testdata/logic_test/check_constraints +++ b/pkg/sql/logictest/testdata/logic_test/check_constraints @@ -219,16 +219,18 @@ query TT SHOW CREATE TABLE t7 ---- t7 CREATE TABLE t7 ( - x INT NULL, - y INT NULL, - z INT NULL, - FAMILY "primary" (x, y, z, rowid), - CONSTRAINT check_x CHECK (x > 0), - CONSTRAINT check_x_y CHECK ((x + y) > 0), - CONSTRAINT check_y_z CHECK ((y + z) > 0), - CONSTRAINT check_y_z1 CHECK ((y + z) = 0), - CONSTRAINT named_constraint CHECK (z = 1) - ) + x INT NULL, + y INT NULL, + z INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + FAMILY "primary" (x, y, z, rowid), + CONSTRAINT check_x CHECK (x > 0), + CONSTRAINT check_x_y CHECK ((x + y) > 0), + CONSTRAINT check_y_z CHECK ((y + z) > 0), + CONSTRAINT check_y_z1 CHECK ((y + z) = 0), + CONSTRAINT named_constraint CHECK (z = 1) +) # Check that table references are dequalified in their stored representation. @@ -256,12 +258,14 @@ query TT SHOW CREATE TABLE t8 ---- t8 CREATE TABLE t8 ( - a INT NULL, - FAMILY "primary" (a, rowid), - CONSTRAINT check_a CHECK (a > 0), - CONSTRAINT check_a1 CHECK (a > 0), - CONSTRAINT check_a2 CHECK (a > 0) - ) + a INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + FAMILY "primary" (a, rowid), + CONSTRAINT check_a CHECK (a > 0), + CONSTRAINT check_a1 CHECK (a > 0), + CONSTRAINT check_a2 CHECK (a > 0) +) statement ok CREATE DATABASE test2 diff --git a/pkg/sql/logictest/testdata/logic_test/collatedstring b/pkg/sql/logictest/testdata/logic_test/collatedstring index cd9d1439c399..ab2f051e2377 100644 --- a/pkg/sql/logictest/testdata/logic_test/collatedstring +++ b/pkg/sql/logictest/testdata/logic_test/collatedstring @@ -203,9 +203,11 @@ query TT SHOW CREATE TABLE t ---- t CREATE TABLE t ( - a STRING COLLATE en NULL, - FAMILY "primary" (a, rowid) - ) + a STRING COLLATE en NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + FAMILY "primary" (a, rowid) +) statement ok INSERT INTO t VALUES diff --git a/pkg/sql/logictest/testdata/logic_test/computed b/pkg/sql/logictest/testdata/logic_test/computed index 0dbdecc90a64..a7696f10ce15 100644 --- a/pkg/sql/logictest/testdata/logic_test/computed +++ b/pkg/sql/logictest/testdata/logic_test/computed @@ -10,12 +10,14 @@ CREATE TABLE with_no_column_refs ( query TT SHOW CREATE TABLE with_no_column_refs ---- -with_no_column_refs CREATE TABLE with_no_column_refs ( - a INT NULL, - b INT NULL, - c INT NULL AS (3) STORED, - FAMILY "primary" (a, b, c, rowid) - ) +with_no_column_refs CREATE TABLE with_no_column_refs ( + a INT NULL, + b INT NULL, + c INT NULL AS (3) STORED, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + FAMILY "primary" (a, b, c, rowid) +) statement ok CREATE TABLE extra_parens ( @@ -27,12 +29,14 @@ CREATE TABLE extra_parens ( query TT SHOW CREATE TABLE extra_parens ---- -extra_parens CREATE TABLE extra_parens ( - a INT NULL, - b INT NULL, - c INT NULL AS ((3)) STORED, - FAMILY "primary" (a, b, c, rowid) - ) +extra_parens CREATE TABLE extra_parens ( + a INT NULL, + b INT NULL, + c INT NULL AS ((3)) STORED, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + FAMILY "primary" (a, b, c, rowid) +) statement error cannot write directly to computed column "c" @@ -79,13 +83,15 @@ CREATE TABLE x ( query TT SHOW CREATE TABLE x ---- -x CREATE TABLE x ( - a INT NULL DEFAULT 3:::INT, - b INT NULL DEFAULT 7:::INT, - c INT NULL AS (a) STORED, - d INT NULL AS (a + b) STORED, - FAMILY "primary" (a, b, c, d, rowid) - ) +x CREATE TABLE x ( + a INT NULL DEFAULT 3:::INT, + b INT NULL DEFAULT 7:::INT, + c INT NULL AS (a) STORED, + d INT NULL AS (a + b) STORED, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + FAMILY "primary" (a, b, c, d, rowid) +) statement error cannot write directly to computed column "c" INSERT INTO x (c) VALUES (1) @@ -587,11 +593,13 @@ CREATE TABLE x ( query TT SHOW CREATE TABLE x ---- -x CREATE TABLE x ( - a INT NULL, - b INT NULL AS (a) STORED, - FAMILY "primary" (a, b, rowid) - ) +x CREATE TABLE x ( + a INT NULL, + b INT NULL AS (a) STORED, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + FAMILY "primary" (a, b, rowid) +) statement ok DROP TABLE x @@ -609,11 +617,13 @@ ALTER TABLE x RENAME COLUMN a TO c query TT SHOW CREATE TABLE x ---- -x CREATE TABLE x ( - c INT NULL, - b INT NULL AS (c) STORED, - FAMILY "primary" (c, b, rowid) - ) +x CREATE TABLE x ( + c INT NULL, + b INT NULL AS (c) STORED, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + FAMILY "primary" (c, b, rowid) +) statement ok DROP TABLE x @@ -648,10 +658,12 @@ query TT SHOW CREATE TABLE x ---- x CREATE TABLE x ( - a INT NULL, - b INT NULL AS (a * 2) STORED, - c INT NULL AS (a + 4) STORED, - FAMILY "primary" (a, b, rowid, c) + a INT NULL, + b INT NULL AS (a * 2) STORED, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + c INT NULL AS (a + 4) STORED, + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + FAMILY "primary" (a, b, rowid, c) ) statement ok diff --git a/pkg/sql/logictest/testdata/logic_test/create_statements b/pkg/sql/logictest/testdata/logic_test/create_statements index cde5f909a2f5..0d90fd558e09 100644 --- a/pkg/sql/logictest/testdata/logic_test/create_statements +++ b/pkg/sql/logictest/testdata/logic_test/create_statements @@ -12,17 +12,23 @@ SELECT create_statement, create_nofks, alter_statements, validate_statements FRO create_statement create_nofks alter_statements validate_statements CREATE TABLE t ( a INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), CONSTRAINT fk_a_ref_t FOREIGN KEY (a) REFERENCES t (rowid), INDEX t_auto_index_fk_a_ref_t (a ASC), FAMILY "primary" (a, rowid) ) CREATE TABLE t ( a INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), INDEX t_auto_index_fk_a_ref_t (a ASC), FAMILY "primary" (a, rowid) ) {"ALTER TABLE t ADD CONSTRAINT fk_a_ref_t FOREIGN KEY (a) REFERENCES t (rowid)"} {"ALTER TABLE t VALIDATE CONSTRAINT fk_a_ref_t"} CREATE TABLE v ( "'" INT NULL, s STRING NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), CONSTRAINT fk_s_ref_v FOREIGN KEY (s) REFERENCES v (s), UNIQUE INDEX v_s_key (s ASC), CONSTRAINT "fk_'_ref_t" FOREIGN KEY ("'") REFERENCES t (rowid), @@ -31,6 +37,8 @@ CREATE TABLE v ( ) CREATE TABLE v ( "'" INT NULL, s STRING NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), UNIQUE INDEX v_s_key (s ASC), INDEX "v_auto_index_fk_'_ref_t" ("'" ASC), FAMILY "primary" ("'", s, rowid) diff --git a/pkg/sql/logictest/testdata/logic_test/fk b/pkg/sql/logictest/testdata/logic_test/fk index c47f2cd0b93f..810dc73c14c1 100644 --- a/pkg/sql/logictest/testdata/logic_test/fk +++ b/pkg/sql/logictest/testdata/logic_test/fk @@ -237,15 +237,17 @@ query TT SHOW CREATE TABLE delivery ---- delivery CREATE TABLE delivery ( - ts TIMESTAMP NULL DEFAULT now(), - "order" INT NULL, - shipment INT NULL, - item STRING NULL, - CONSTRAINT fk_item_ref_products FOREIGN KEY (item) REFERENCES products (upc), - INDEX delivery_item_idx (item ASC), - CONSTRAINT fk_order_ref_orders FOREIGN KEY ("order", shipment) REFERENCES orders (id, shipment), - INDEX delivery_auto_index_fk_order_ref_orders ("order" ASC, shipment ASC), - FAMILY "primary" (ts, "order", shipment, item, rowid) + ts TIMESTAMP NULL DEFAULT now(), + "order" INT NULL, + shipment INT NULL, + item STRING NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + CONSTRAINT fk_item_ref_products FOREIGN KEY (item) REFERENCES products (upc), + INDEX delivery_item_idx (item ASC), + CONSTRAINT fk_order_ref_orders FOREIGN KEY ("order", shipment) REFERENCES orders (id, shipment), + INDEX delivery_auto_index_fk_order_ref_orders ("order" ASC, shipment ASC), + FAMILY "primary" (ts, "order", shipment, item, rowid) ) statement ok @@ -591,12 +593,14 @@ query TT SHOW CREATE TABLE refpairs ---- refpairs CREATE TABLE refpairs ( - a INT NULL, - b STRING NULL, - c INT NULL, - CONSTRAINT fk_a_ref_pairs FOREIGN KEY (a, b) REFERENCES pairs (src, dest) ON UPDATE RESTRICT, - INDEX refpairs_a_b_c_idx (a ASC, b ASC, c ASC), - FAMILY "primary" (a, b, c, rowid) + a INT NULL, + b STRING NULL, + c INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + CONSTRAINT fk_a_ref_pairs FOREIGN KEY (a, b) REFERENCES pairs (src, dest) ON UPDATE RESTRICT, + INDEX refpairs_a_b_c_idx (a ASC, b ASC, c ASC), + FAMILY "primary" (a, b, c, rowid) ) statement error pgcode 23503 foreign key violation: value \[100 'two'\] not found in pairs@pairs_src_dest_key \[src dest\] @@ -803,13 +807,15 @@ query TT SHOW CREATE TABLE refers ---- refers CREATE TABLE refers ( - a INT NULL, - b INT NULL, - INDEX another_idx (b ASC), - CONSTRAINT fk_a_ref_referee FOREIGN KEY (a) REFERENCES referee (id), - INDEX refers_auto_index_fk_a_ref_referee (a ASC), - INDEX foo (a ASC), - FAMILY "primary" (a, b, rowid) + a INT NULL, + b INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + INDEX another_idx (b ASC), + CONSTRAINT fk_a_ref_referee FOREIGN KEY (a) REFERENCES referee (id), + INDEX refers_auto_index_fk_a_ref_referee (a ASC), + INDEX foo (a ASC), + FAMILY "primary" (a, b, rowid) ) statement ok diff --git a/pkg/sql/logictest/testdata/logic_test/hidden_columns b/pkg/sql/logictest/testdata/logic_test/hidden_columns new file mode 100644 index 000000000000..a7e33b71f7bb --- /dev/null +++ b/pkg/sql/logictest/testdata/logic_test/hidden_columns @@ -0,0 +1,102 @@ +# LogicTest: local local-opt local-parallel-stmts fakedist fakedist-opt fakedist-metadata + +statement ok +CREATE TABLE t (x INT NOT VISIBLE); + CREATE TABLE kv ( + k INT PRIMARY KEY NOT VISIBLE, + v INT NOT VISIBLE + ) + +# Verify that hidden columns can be explicitly inserted into. + +statement ok +INSERT INTO t(x) VALUES (123) + +statement ok +INSERT INTO kv(k,v) VALUES (123,456); + +# Verify that hidden columns cannot be implicitly inserted into + +statement error INSERT has more expressions than target columns, 1 expressions for 0 targets +INSERT INTO t VALUES (123) + +statement error INSERT has more expressions than target columns, 2 expressions for 0 targets +INSERT INTO kv VALUES (111, 222) + +# Verify the right columns are hidden. + +query TT +SHOW CREATE TABLE t +---- +t CREATE TABLE t ( + x INT NOT VISIBLE NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + FAMILY "primary" (x, rowid) +) + +query TT +SHOW CREATE TABLE t +---- +t CREATE TABLE t ( + x INT NOT VISIBLE NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + FAMILY "primary" (x, rowid) +) + +# Check that stars expand to no columns. + +query I +SELECT 42, * FROM t +---- +42 + +query I +SELECT 42, * FROM kv +---- +42 + +# Check that the hidden column can be selected explicitly. + +query II +SELECT 42, x FROM t +---- +42 123 + +# Check that ALTER can make hidden columns visible. + +statement ok +ALTER TABLE kv ALTER v SET VISIBLE + +query TT +SHOW CREATE TABLE kv +---- +kv CREATE TABLE kv ( + k INT NOT VISIBLE NOT NULL, + v INT NULL, + CONSTRAINT "primary" PRIMARY KEY (k ASC), + FAMILY "primary" (k, v) +) + +# Check that ALTER can even make rowid visible. + +statement ok +ALTER TABLE t ALTER rowid SET VISIBLE + +query TT +SHOW CREATE TABLE t +---- +t CREATE TABLE t ( + x INT NOT VISIBLE NULL, + rowid INT NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + FAMILY "primary" (x, rowid) +) + +# Check that rowid is properly auto-selected by star expansion. + +query I +SELECT rowid-rowid FROM (SELECT * FROM t) +---- +0 diff --git a/pkg/sql/logictest/testdata/logic_test/name_escapes b/pkg/sql/logictest/testdata/logic_test/name_escapes index 52c077ffb9d2..3223e118320e 100644 --- a/pkg/sql/logictest/testdata/logic_test/name_escapes +++ b/pkg/sql/logictest/testdata/logic_test/name_escapes @@ -61,5 +61,7 @@ SHOW CREATE TABLE ";--dontask" a INT NULL, b INT NULL, c INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), FAMILY "primary" (a, b, c, rowid) ) diff --git a/pkg/sql/logictest/testdata/logic_test/schema_change_in_txn b/pkg/sql/logictest/testdata/logic_test/schema_change_in_txn index c25617bbe06a..6574ffca5f51 100644 --- a/pkg/sql/logictest/testdata/logic_test/schema_change_in_txn +++ b/pkg/sql/logictest/testdata/logic_test/schema_change_in_txn @@ -98,13 +98,15 @@ query TT SHOW CREATE TABLE b ---- b CREATE TABLE b ( - parent_id INT NULL, - d INT NULL DEFAULT 23:::INT, - CONSTRAINT fk_parent_id_ref_parent FOREIGN KEY (parent_id) REFERENCES parent (id), - INDEX b_auto_index_fk_parent_id_ref_parent (parent_id ASC), - INDEX foo (parent_id ASC), - UNIQUE INDEX bar (parent_id ASC), - FAMILY "primary" (parent_id, rowid, d) + parent_id INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + d INT NULL DEFAULT 23:::INT, + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), + CONSTRAINT fk_parent_id_ref_parent FOREIGN KEY (parent_id) REFERENCES parent (id), + INDEX b_auto_index_fk_parent_id_ref_parent (parent_id ASC), + INDEX foo (parent_id ASC), + UNIQUE INDEX bar (parent_id ASC), + FAMILY "primary" (parent_id, rowid, d) ) # table b is not visible to the transaction #17949 diff --git a/pkg/sql/logictest/testdata/logic_test/table b/pkg/sql/logictest/testdata/logic_test/table index e801060ea952..f0ad2484b073 100644 --- a/pkg/sql/logictest/testdata/logic_test/table +++ b/pkg/sql/logictest/testdata/logic_test/table @@ -449,6 +449,8 @@ SHOW CREATE TABLE test.null_default ---- test.public.null_default CREATE TABLE null_default ( ts TIMESTAMP NULL DEFAULT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), FAMILY "primary" (ts, rowid) ) diff --git a/pkg/sql/opt/testutils/testcat/create_table.go b/pkg/sql/opt/testutils/testcat/create_table.go index d0ce45437b35..68e82c466fec 100644 --- a/pkg/sql/opt/testutils/testcat/create_table.go +++ b/pkg/sql/opt/testutils/testcat/create_table.go @@ -116,7 +116,7 @@ func (tc *Catalog) qualifyTableName(name *tree.TableName) { func (tt *Table) addColumn(def *tree.ColumnTableDef) { nullable := !def.PrimaryKey && def.Nullable.Nullability != tree.NotNull typ := coltypes.CastTargetToDatumType(def.Type) - col := &Column{Name: string(def.Name), Type: typ, Nullable: nullable} + col := &Column{Name: string(def.Name), Type: typ, Nullable: nullable, Hidden: def.Hidden} tt.Columns = append(tt.Columns, col) if def.PrimaryKey { diff --git a/pkg/sql/parser/parse_test.go b/pkg/sql/parser/parse_test.go index 83fc6ad2a894..09eaa78a9bca 100644 --- a/pkg/sql/parser/parse_test.go +++ b/pkg/sql/parser/parse_test.go @@ -121,6 +121,8 @@ func TestParse(t *testing.T) { {`CREATE TABLE a (a INT DEFAULT 1 CONSTRAINT positive CHECK (a > 0))`}, {`CREATE TABLE a (a INT CONSTRAINT one DEFAULT 1 CONSTRAINT positive CHECK (a > 0))`}, {`CREATE TABLE a (a INT CONSTRAINT one CHECK (a > 0) CONSTRAINT two CHECK (a < 10))`}, + {`CREATE TABLE a (b INT NOT VISIBLE)`}, + {`CREATE TABLE a (b INT NOT VISIBLE NULL)`}, // "0" lost quotes previously. {`CREATE TABLE a (b INT, c TEXT, PRIMARY KEY (b, c, "0"))`}, {`CREATE TABLE a (b INT, c TEXT, FOREIGN KEY (b) REFERENCES other)`}, @@ -894,6 +896,8 @@ func TestParse(t *testing.T) { {`ALTER TABLE a ALTER COLUMN b DROP NOT NULL`}, {`ALTER TABLE a ALTER b DROP NOT NULL`}, {`ALTER TABLE a ALTER COLUMN b DROP STORED`}, + {`ALTER TABLE a ALTER COLUMN b SET VISIBLE`}, + {`ALTER TABLE a ALTER COLUMN b SET NOT VISIBLE`}, {`ALTER TABLE a ALTER b TYPE INT`}, {`ALTER TABLE a ALTER COLUMN b SET DATA TYPE INT`}, diff --git a/pkg/sql/parser/sql.y b/pkg/sql/parser/sql.y index 1e6f2b1d714f..61e1c542fcdd 100644 --- a/pkg/sql/parser/sql.y +++ b/pkg/sql/parser/sql.y @@ -537,7 +537,7 @@ func newNameFromStr(s string) *tree.Name { %token UNBOUNDED UNCOMMITTED UNION UNIQUE UNKNOWN %token UPDATE UPSERT USE USER USERS USING UUID -%token VALID VALIDATE VALUE VALUES VARCHAR VARIADIC VIEW VARYING VIRTUAL +%token VALID VALIDATE VALUE VALUES VARCHAR VARIADIC VIEW VISIBLE VARYING VIRTUAL %token WHEN WHERE WINDOW WITH WITHIN WITHOUT WORK WRITE @@ -1104,6 +1104,7 @@ alter_ddl_stmt: // ALTER TABLE ... ALTER [COLUMN] {SET DEFAULT | DROP DEFAULT} // ALTER TABLE ... ALTER [COLUMN] DROP NOT NULL // ALTER TABLE ... ALTER [COLUMN] DROP STORED +// ALTER TABLE ... ALTER [COLUMN] SET [NOT] VISIBLE // ALTER TABLE ... ALTER [COLUMN] [SET DATA] TYPE [COLLATE ] // ALTER TABLE ... RENAME TO // ALTER TABLE ... RENAME [COLUMN] TO @@ -1372,7 +1373,17 @@ alter_table_cmd: { $$.val = &tree.AlterTableSetDefault{ColumnKeyword: $2.bool(), Column: tree.Name($3), Default: $4.expr()} } - // ALTER TABLE ALTER [COLUMN] DROP NOT NULL + // ALTER TABLE ALTER [COLUMN] SET NOT VISIBLE +| ALTER opt_column column_name SET NOT VISIBLE + { + $$.val = &tree.AlterTableSetHidden{Column: tree.Name($3), Hidden: true} + } + // ALTER TABLE ALTER [COLUMN] SET VISIBLE +| ALTER opt_column column_name SET VISIBLE + { + $$.val = &tree.AlterTableSetHidden{Column: tree.Name($3), Hidden: false} + } + // ALTER TABLE ALTER [COLUMN] DROP NOT NULL | ALTER opt_column column_name DROP NOT NULL { $$.val = &tree.AlterTableDropNotNull{ColumnKeyword: $2.bool(), Column: tree.Name($3)} @@ -3823,6 +3834,10 @@ col_qualification_elem: sqllex.Error("syntax error: use AS ( ) STORED") return 1 } +| NOT VISIBLE + { + $$.val = tree.HiddenConstraint{} + } index_def: INDEX opt_index_name '(' index_params ')' opt_storing opt_interleave opt_partition_by @@ -8129,6 +8144,7 @@ unreserved_keyword: | VALIDATE | VALUE | VARYING +| VISIBLE | WITHIN | WITHOUT | WRITE diff --git a/pkg/sql/sem/tree/alter_table.go b/pkg/sql/sem/tree/alter_table.go index 76162cd00ddf..f586a452c6a0 100644 --- a/pkg/sql/sem/tree/alter_table.go +++ b/pkg/sql/sem/tree/alter_table.go @@ -65,6 +65,7 @@ func (*AlterTableDropNotNull) alterTableCmd() {} func (*AlterTableDropStored) alterTableCmd() {} func (*AlterTableSetAudit) alterTableCmd() {} func (*AlterTableSetDefault) alterTableCmd() {} +func (*AlterTableSetHidden) alterTableCmd() {} func (*AlterTableValidateConstraint) alterTableCmd() {} func (*AlterTablePartitionBy) alterTableCmd() {} func (*AlterTableInjectStats) alterTableCmd() {} @@ -78,6 +79,7 @@ var _ AlterTableCmd = &AlterTableDropNotNull{} var _ AlterTableCmd = &AlterTableDropStored{} var _ AlterTableCmd = &AlterTableSetAudit{} var _ AlterTableCmd = &AlterTableSetDefault{} +var _ AlterTableCmd = &AlterTableSetHidden{} var _ AlterTableCmd = &AlterTableValidateConstraint{} var _ AlterTableCmd = &AlterTablePartitionBy{} var _ AlterTableCmd = &AlterTableInjectStats{} @@ -197,6 +199,28 @@ func (node *AlterTableDropColumn) Format(ctx *FmtCtx) { } } +// AlterTableSetHidden represents a SET [NOT] VISIBLE command. +type AlterTableSetHidden struct { + Column Name + Hidden bool +} + +// Format implements the NodeFormatter interface. +func (node *AlterTableSetHidden) Format(ctx *FmtCtx) { + ctx.WriteString(" ALTER COLUMN ") + ctx.FormatNode(&node.Column) + ctx.WriteString(" SET") + if node.Hidden { + ctx.WriteString(" NOT") + } + ctx.WriteString(" VISIBLE") +} + +// GetColumn implements the ColumnMutationCmd interface. +func (node *AlterTableSetHidden) GetColumn() Name { + return node.Column +} + // AlterTableDropConstraint represents a DROP CONSTRAINT command. type AlterTableDropConstraint struct { IfExists bool diff --git a/pkg/sql/sem/tree/create.go b/pkg/sql/sem/tree/create.go index 4641c48ee5d2..742854952715 100644 --- a/pkg/sql/sem/tree/create.go +++ b/pkg/sql/sem/tree/create.go @@ -194,6 +194,7 @@ const ( type ColumnTableDef struct { Name Name Type coltypes.T + Hidden bool Nullable struct { Nullability Nullability ConstraintName Name @@ -279,6 +280,8 @@ func NewColumnTableDef( } d.DefaultExpr.Expr = t.Expr d.DefaultExpr.ConstraintName = c.Name + case HiddenConstraint: + d.Hidden = true case NotNullConstraint: if d.Nullable.Nullability == Null { return nil, pgerror.NewErrorf(pgerror.CodeSyntaxError, @@ -365,6 +368,9 @@ func (node *ColumnTableDef) Format(ctx *FmtCtx) { ctx.WriteString(" CONSTRAINT ") ctx.FormatNode(&node.Nullable.ConstraintName) } + if node.Hidden { + ctx.WriteString(" NOT VISIBLE") + } switch node.Nullable.Nullability { case Null: ctx.WriteString(" NULL") @@ -442,6 +448,7 @@ func (ColumnCollation) columnQualification() {} func (*ColumnDefault) columnQualification() {} func (NotNullConstraint) columnQualification() {} func (NullConstraint) columnQualification() {} +func (HiddenConstraint) columnQualification() {} func (PrimaryKeyConstraint) columnQualification() {} func (UniqueConstraint) columnQualification() {} func (*ColumnCheckConstraint) columnQualification() {} @@ -463,6 +470,9 @@ type NotNullConstraint struct{} // NullConstraint represents NULL on a column. type NullConstraint struct{} +// HiddenConstraint represents HIDDEN on a column. +type HiddenConstraint struct{} + // PrimaryKeyConstraint represents NULL on a column. type PrimaryKeyConstraint struct{} diff --git a/pkg/sql/show_create.go b/pkg/sql/show_create.go index 3b467e11e851..b8e31ab26cb2 100644 --- a/pkg/sql/show_create.go +++ b/pkg/sql/show_create.go @@ -193,20 +193,16 @@ func (p *planner) showCreateTable( f.WriteString("CREATE TABLE ") f.FormatNode(tn) f.WriteString(" (") - primaryKeyIsOnVisibleColumn := false - for i, col := range desc.VisibleColumns() { + for i, col := range desc.Columns { if i != 0 { f.WriteString(",") } f.WriteString("\n\t") f.WriteString(col.SQLString()) - if desc.IsPhysicalTable() && desc.PrimaryIndex.ColumnIDs[0] == col.ID { - // Only set primaryKeyIsOnVisibleColumn to true if the primary key - // is on a visible column (not rowid). - primaryKeyIsOnVisibleColumn = true - } } - if primaryKeyIsOnVisibleColumn { + if len(desc.PrimaryIndex.ColumnIDs) > 0 { + // Virtual tables do not have PK columns. Do not print a + // constraint in this case. f.WriteString(",\n\tCONSTRAINT ") formatQuoteNames(f.Buffer, desc.PrimaryIndex.Name) f.WriteString(" ") diff --git a/pkg/sql/show_test.go b/pkg/sql/show_test.go index 2e19abfffa2b..ef4441e8c104 100644 --- a/pkg/sql/show_test.go +++ b/pkg/sql/show_test.go @@ -79,6 +79,8 @@ func TestShowCreateTable(t *testing.T) { s STRING NULL, v FLOAT NOT NULL, t TIMESTAMP NULL DEFAULT now(), + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), FAMILY "primary" (i, v, t, rowid), FAMILY fam_1_s (s), CONSTRAINT check_i CHECK (i > 0) @@ -98,6 +100,8 @@ func TestShowCreateTable(t *testing.T) { s STRING NULL, v FLOAT NOT NULL, t TIMESTAMP NULL DEFAULT now(), + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), FAMILY "primary" (i, v, t, rowid), FAMILY fam_1_s (s), CONSTRAINT check_i CHECK (i > 0) @@ -114,6 +118,8 @@ func TestShowCreateTable(t *testing.T) { expect: `CREATE TABLE %s ( i INT NULL, s STRING NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), FAMILY "primary" (i, rowid), FAMILY fam_1_s (s), CONSTRAINT ck CHECK (i > 0) @@ -142,6 +148,8 @@ func TestShowCreateTable(t *testing.T) { f FLOAT NULL, s STRING NULL, d DATE NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), INDEX idx_if (f ASC, i ASC) STORING (s, d), UNIQUE INDEX %[1]s_d_key (d ASC), FAMILY "primary" (i, f, d, rowid), @@ -164,6 +172,8 @@ func TestShowCreateTable(t *testing.T) { expect: `CREATE TABLE %s ( a INT NULL, b INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), INDEX c (a ASC, b DESC), FAMILY "primary" (a, b, rowid) )`, @@ -181,6 +191,8 @@ func TestShowCreateTable(t *testing.T) { i INT NULL, j INT NULL, k INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), CONSTRAINT fk_i_ref_items FOREIGN KEY (i, j) REFERENCES items (a, b), INDEX t7_auto_index_fk_i_ref_items (i ASC, j ASC), CONSTRAINT fk_k_ref_items FOREIGN KEY (k) REFERENCES items (c), @@ -197,6 +209,8 @@ func TestShowCreateTable(t *testing.T) { )`, expect: `CREATE TABLE %s ( x INT NULL, + rowid INT NOT VISIBLE NOT NULL DEFAULT unique_rowid(), + CONSTRAINT "primary" PRIMARY KEY (rowid ASC), CONSTRAINT fk_ref FOREIGN KEY (x) REFERENCES o.public.foo (x), INDEX t8_auto_index_fk_ref (x ASC), FAMILY "primary" (x, rowid) diff --git a/pkg/sql/sqlbase/structured.go b/pkg/sql/sqlbase/structured.go index 706de777679b..d6fd9a937ab4 100644 --- a/pkg/sql/sqlbase/structured.go +++ b/pkg/sql/sqlbase/structured.go @@ -2546,6 +2546,9 @@ func (desc *ColumnDescriptor) SQLString() string { f.FormatNameP(&desc.Name) f.WriteByte(' ') f.WriteString(desc.Type.SQLString()) + if desc.Hidden { + f.WriteString(" NOT VISIBLE") + } if desc.Nullable { f.WriteString(" NULL") } else { diff --git a/pkg/sql/sqlbase/table.go b/pkg/sql/sqlbase/table.go index b089a8796665..79e603882d6a 100644 --- a/pkg/sql/sqlbase/table.go +++ b/pkg/sql/sqlbase/table.go @@ -179,6 +179,7 @@ func MakeColumnDefDescs( ) (*ColumnDescriptor, *IndexDescriptor, tree.TypedExpr, error) { col := &ColumnDescriptor{ Name: string(d.Name), + Hidden: d.Hidden, Nullable: d.Nullable.Nullability != tree.NotNull && !d.PrimaryKey, }