From 8fe4986981709e7187e1a26d79008482269e049b Mon Sep 17 00:00:00 2001 From: Lucy Zhang Date: Tue, 18 Jun 2019 14:02:28 -0400 Subject: [PATCH] sql: support ALTER COLUMN SET NOT NULL This PR adds support for `ALTER TABLE ... ALTER COLUMN ... SET NOT NULL`, to add a non-null constraint to an existing column. This is done by creating a dummy CHECK constraint in the `Validating` state which moves through the states of the schema changer, and setting `Nullable` to true on the column descriptor only at the very end. Adding a constraint to an existing column requires the constraint to be in a "write-only" state while validation occurs, and the advantage of the approach in this PR is that we can reuse the existing CHECK constraint states, where "write-only" corresponds to the state where the constraint is on the table descriptor in the `Validating` state. (As with FK and check constraints, we still need to process dropped constraints in the schema changer. That's been left for a separate PR.) Release note (sql change): Add support for `ALTER TABLE ... ALTER COLUMN ... SET NOT NULL`, which adds a non-null constraint to an existing column. --- docs/generated/sql/bnf/alter_column.bnf | 4 + docs/generated/sql/bnf/alter_table.bnf | 4 +- docs/generated/sql/bnf/stmt_block.bnf | 1 + pkg/server/updates_test.go | 6 - pkg/sql/alter_table.go | 34 ++ pkg/sql/backfill.go | 21 +- pkg/sql/backfill/backfill.go | 2 +- pkg/sql/distsqlrun/indexbackfiller.go | 2 +- .../logictest/testdata/logic_test/alter_table | 58 ++ .../testdata/logic_test/schema_change_in_txn | 64 +++ pkg/sql/parser/parse_test.go | 1 - pkg/sql/parser/sql.y | 5 +- pkg/sql/schema_changer.go | 6 +- pkg/sql/sem/tree/alter_table.go | 20 + pkg/sql/sem/tree/stmt.go | 1 + pkg/sql/sqlbase/structured.go | 97 +++- pkg/sql/sqlbase/structured.pb.go | 499 ++++++++++-------- pkg/sql/sqlbase/structured.proto | 7 + 18 files changed, 590 insertions(+), 242 deletions(-) diff --git a/docs/generated/sql/bnf/alter_column.bnf b/docs/generated/sql/bnf/alter_column.bnf index 1046df0d371e..d2c9ed9c2378 100644 --- a/docs/generated/sql/bnf/alter_column.bnf +++ b/docs/generated/sql/bnf/alter_column.bnf @@ -7,6 +7,8 @@ alter_onetable_stmt ::= | 'ALTER' 'TABLE' table_name 'ALTER' column_name 'DROP' 'NOT' 'NULL' | 'ALTER' 'TABLE' table_name 'ALTER' 'COLUMN' column_name 'DROP' 'STORED' | 'ALTER' 'TABLE' table_name 'ALTER' column_name 'DROP' 'STORED' + | 'ALTER' 'TABLE' table_name 'ALTER' 'COLUMN' column_name 'SET' 'NOT' 'NULL' + | 'ALTER' 'TABLE' table_name 'ALTER' column_name 'SET' 'NOT' 'NULL' | 'ALTER' 'TABLE' table_name 'ALTER' 'COLUMN' column_name 'SET' 'DATA' 'TYPE' typename 'COLLATE' collation_name 'USING' a_expr | 'ALTER' 'TABLE' table_name 'ALTER' 'COLUMN' column_name 'SET' 'DATA' 'TYPE' typename 'COLLATE' collation_name | 'ALTER' 'TABLE' table_name 'ALTER' 'COLUMN' column_name 'SET' 'DATA' 'TYPE' typename 'USING' a_expr @@ -31,6 +33,8 @@ alter_onetable_stmt ::= | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' column_name 'DROP' 'NOT' 'NULL' | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' 'COLUMN' column_name 'DROP' 'STORED' | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' column_name 'DROP' 'STORED' + | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' 'COLUMN' column_name 'SET' 'NOT' 'NULL' + | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' column_name 'SET' 'NOT' 'NULL' | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' 'COLUMN' column_name 'SET' 'DATA' 'TYPE' typename 'COLLATE' collation_name 'USING' a_expr | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' 'COLUMN' column_name 'SET' 'DATA' 'TYPE' typename 'COLLATE' collation_name | 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'ALTER' 'COLUMN' column_name 'SET' 'DATA' 'TYPE' typename 'USING' a_expr diff --git a/docs/generated/sql/bnf/alter_table.bnf b/docs/generated/sql/bnf/alter_table.bnf index 24d3d5aa2902..b12bb307919f 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 '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 ) ) ( ( ',' ( '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 '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 ) ) )* ) - | '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 '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 ) ) ( ( ',' ( '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 '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 ) ) )* ) + '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 '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 ) | '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 ) ) ( ( ',' ( '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 '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 ) | '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 ) ) )* ) + | '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 '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 ) | '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 ) ) ( ( ',' ( '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 '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 ) | '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 ) ) )* ) diff --git a/docs/generated/sql/bnf/stmt_block.bnf b/docs/generated/sql/bnf/stmt_block.bnf index 727e7f0e40fb..6fbbc5e914f7 100644 --- a/docs/generated/sql/bnf/stmt_block.bnf +++ b/docs/generated/sql/bnf/stmt_block.bnf @@ -1871,6 +1871,7 @@ alter_table_cmd ::= | 'ALTER' opt_column column_name alter_column_default | '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 diff --git a/pkg/server/updates_test.go b/pkg/server/updates_test.go index a711065519f6..41a6ef6ff7bd 100644 --- a/pkg/server/updates_test.go +++ b/pkg/server/updates_test.go @@ -478,11 +478,6 @@ func TestReportUsage(t *testing.T) { ) { t.Fatal(err) } - if _, err := db.Exec(`ALTER TABLE foo ALTER COLUMN x SET NOT NULL`); !testutils.IsError( - err, "unimplemented", - ) { - t.Fatal(err) - } if _, err := db.Exec(`SELECT crdb_internal.force_assertion_error('woo')`); !testutils.IsError( err, "internal error", ) { @@ -713,7 +708,6 @@ func TestReportUsage(t *testing.T) { "unimplemented.#33285.json_object_agg": 10, "unimplemented.pg_catalog.pg_stat_wal_receiver": 10, - "unimplemented.syntax.#28751": 10, "unimplemented.syntax.#32564": 10, "unimplemented.#9148": 10, "othererror." + diff --git a/pkg/sql/alter_table.go b/pkg/sql/alter_table.go index 9a1046239568..ea9b1afc8ace 100644 --- a/pkg/sql/alter_table.go +++ b/pkg/sql/alter_table.go @@ -809,7 +809,41 @@ func applyColumnMutation( } } + case *tree.AlterTableSetNotNull: + if !col.Nullable { + return nil + } + // See if there's already a mutation to add a not null constraint + for i := range tableDesc.Mutations { + if constraint := tableDesc.Mutations[i].GetConstraint(); constraint != nil && + constraint.ConstraintType == sqlbase.ConstraintToUpdate_NOT_NULL { + return nil + } + } + + info, err := tableDesc.GetConstraintInfo(params.ctx, nil) + if err != nil { + return err + } + inuseNames := make(map[string]struct{}, len(info)) + for k := range info { + inuseNames[k] = struct{}{} + } + tableDesc.AddNotNullValidationMutation(string(t.Column), col.ID, inuseNames) + case *tree.AlterTableDropNotNull: + if col.Nullable { + return nil + } + // See if there's already a mutation to add a not null constraint + for i := range tableDesc.Mutations { + if constraint := tableDesc.Mutations[i].GetConstraint(); constraint != nil && + constraint.ConstraintType == sqlbase.ConstraintToUpdate_NOT_NULL { + return pgerror.Newf(pgcode.ObjectNotInPrerequisiteState, + "constraint in the middle of being added, try again later") + } + } + // TODO (lucy): As with FKs and check constraints, move this to the schema changer col.Nullable = true case *tree.AlterTableDropStored: diff --git a/pkg/sql/backfill.go b/pkg/sql/backfill.go index e5b5fa255e01..37822cb4c872 100644 --- a/pkg/sql/backfill.go +++ b/pkg/sql/backfill.go @@ -254,7 +254,7 @@ func (sc *SchemaChanger) AddConstraints( for i := range constraints { added := &constraints[i] switch added.ConstraintType { - case sqlbase.ConstraintToUpdate_CHECK: + case sqlbase.ConstraintToUpdate_CHECK, sqlbase.ConstraintToUpdate_NOT_NULL: found := false for _, c := range desc.Checks { if c.Name == added.Name { @@ -377,7 +377,7 @@ func (sc *SchemaChanger) validateConstraints( // (the validation can take many minutes). So we pretend that the schema // has been updated and actually update it in a separate transaction that // follows this one. - desc, err := sqlbase.NewImmutableTableDescriptor(*tableDesc).MakeFirstMutationPublic() + desc, err := sqlbase.NewImmutableTableDescriptor(*tableDesc).MakeFirstMutationPublic(sqlbase.IgnoreConstraints) if err != nil { return err } @@ -386,13 +386,20 @@ func (sc *SchemaChanger) validateConstraints( newEvalCtx := createSchemaChangeEvalCtx(ctx, readAsOf, evalCtx.Tracing, sc.ieFactory) switch c.ConstraintType { case sqlbase.ConstraintToUpdate_CHECK: - if err := validateCheckInTxn(ctx, sc.leaseMgr, &newEvalCtx.EvalContext, desc, txn, c.Name); err != nil { + if err := validateCheckInTxn(ctx, sc.leaseMgr, &newEvalCtx.EvalContext, desc, txn, c.Check.Name); err != nil { return err } case sqlbase.ConstraintToUpdate_FOREIGN_KEY: if err := validateFkInTxn(ctx, sc.leaseMgr, &newEvalCtx.EvalContext, desc, txn, c.Name); err != nil { return err } + case sqlbase.ConstraintToUpdate_NOT_NULL: + if err := validateCheckInTxn(ctx, sc.leaseMgr, &newEvalCtx.EvalContext, desc, txn, c.Check.Name); err != nil { + // TODO (lucy): This should distinguish between constraint + // validation errors and other types of unexpected errors, and + // return a different error code in the former case + return errors.Wrap(err, "validation of NOT NULL constraint failed") + } default: return errors.Errorf("unsupported constraint type: %d", c.ConstraintType) } @@ -1028,7 +1035,7 @@ func (sc *SchemaChanger) validateForwardIndexes( // (the validation can take many minutes). So we pretend that the schema // has been updated and actually update it in a separate transaction that // follows this one. - desc, err := sqlbase.NewImmutableTableDescriptor(*tableDesc).MakeFirstMutationPublic() + desc, err := sqlbase.NewImmutableTableDescriptor(*tableDesc).MakeFirstMutationPublic(sqlbase.IgnoreConstraints) if err != nil { return err } @@ -1200,7 +1207,7 @@ func runSchemaChangesInTxn( case *sqlbase.DescriptorMutation_Constraint: switch t.Constraint.ConstraintType { - case sqlbase.ConstraintToUpdate_CHECK: + case sqlbase.ConstraintToUpdate_CHECK, sqlbase.ConstraintToUpdate_NOT_NULL: tableDesc.Checks = append(tableDesc.Checks, &t.Constraint.Check) case sqlbase.ConstraintToUpdate_FOREIGN_KEY: idx, err := tableDesc.FindIndexByID(t.Constraint.ForeignKeyIndex) @@ -1255,8 +1262,8 @@ func runSchemaChangesInTxn( // mutations applied, it can be used for validating check constraints for _, c := range constraintsToValidate { switch c.ConstraintType { - case sqlbase.ConstraintToUpdate_CHECK: - if err := validateCheckInTxn(ctx, tc.leaseMgr, evalCtx, tableDesc, txn, c.Name); err != nil { + case sqlbase.ConstraintToUpdate_CHECK, sqlbase.ConstraintToUpdate_NOT_NULL: + if err := validateCheckInTxn(ctx, tc.leaseMgr, evalCtx, tableDesc, txn, c.Check.Name); err != nil { return err } case sqlbase.ConstraintToUpdate_FOREIGN_KEY: diff --git a/pkg/sql/backfill/backfill.go b/pkg/sql/backfill/backfill.go index 256102649145..3e62005c2846 100644 --- a/pkg/sql/backfill/backfill.go +++ b/pkg/sql/backfill/backfill.go @@ -277,7 +277,7 @@ func ConvertBackfillError( // information useful in printing a sensible error. However // ConvertBatchError() will only work correctly if the schema elements // are "live" in the tableDesc. - desc, err := tableDesc.MakeFirstMutationPublic() + desc, err := tableDesc.MakeFirstMutationPublic(sqlbase.IncludeConstraints) if err != nil { return err } diff --git a/pkg/sql/distsqlrun/indexbackfiller.go b/pkg/sql/distsqlrun/indexbackfiller.go index bfb8b0a62f60..9db5d5212949 100644 --- a/pkg/sql/distsqlrun/indexbackfiller.go +++ b/pkg/sql/distsqlrun/indexbackfiller.go @@ -111,7 +111,7 @@ func (ib *indexBackfiller) wrapDupError(ctx context.Context, orig error) error { return orig } - desc, err := ib.desc.MakeFirstMutationPublic() + desc, err := ib.desc.MakeFirstMutationPublic(sqlbase.IncludeConstraints) immutable := sqlbase.NewImmutableTableDescriptor(*desc.TableDesc()) if err != nil { return err diff --git a/pkg/sql/logictest/testdata/logic_test/alter_table b/pkg/sql/logictest/testdata/logic_test/alter_table index 3d45603cec24..2da71729e48f 100644 --- a/pkg/sql/logictest/testdata/logic_test/alter_table +++ b/pkg/sql/logictest/testdata/logic_test/alter_table @@ -914,3 +914,61 @@ ALTER TABLE t32917_2 ADD CONSTRAINT fk_c_a FOREIGN KEY (c) references t32917 (a) statement ok ROLLBACK + +# Test SET NOT NULL +statement ok +CREATE TABLE t (a INT) + +statement ok +INSERT INTO t VALUES (1), (NULL) + +statement error validation of NOT NULL constraint failed: validation of CHECK "a IS NOT NULL" failed +ALTER TABLE t ALTER COLUMN a SET NOT NULL + +statement ok +DELETE FROM t WHERE a IS NULL + +statement ok +ALTER TABLE t ALTER COLUMN a SET NOT NULL + +statement error null value in column "a" violates not-null constraint +INSERT INTO t VALUES (NULL) + +query TTTTB +SHOW CONSTRAINTS FROM t +---- + +statement ok +ALTER TABLE t ALTER COLUMN a DROP NOT NULL + +statement ok +INSERT INTO t VALUES (NULL) + +statement ok +DROP TABLE t + +# Test interaction of SET NOT NULL with other constraints +statement ok +CREATE TABLE t (a INT) + +statement ok +INSERT INTO t VALUES (1) + +# Check for name collisions with the auto-generated NOT NULL check constraint name +statement ok +ALTER TABLE t ADD CONSTRAINT a_auto_not_null CHECK (a IS NOT NULL) + +statement ok +ALTER TABLE t ADD CONSTRAINT a_auto_not_null1 CHECK (a IS NOT NULL), ALTER COLUMN a SET NOT NULL + +statement error null value in column "a" violates not-null constraint +INSERT INTO t VALUES (NULL) + +query TTTTB +SHOW CONSTRAINTS FROM t +---- +t a_auto_not_null CHECK CHECK (a IS NOT NULL) true +t a_auto_not_null1 CHECK CHECK (a IS NOT NULL) true + +statement ok +DROP TABLE t 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 376feb684641..24d492038ce4 100644 --- a/pkg/sql/logictest/testdata/logic_test/schema_change_in_txn +++ b/pkg/sql/logictest/testdata/logic_test/schema_change_in_txn @@ -1405,3 +1405,67 @@ COMMIT statement ok DROP TABLE t + +# Test adding NOT NULL constraints on a new column. +subtest not_null_new_column + +statement ok +CREATE TABLE t (a INT) + +statement ok +INSERT INTO t VALUES (1) + +statement ok +BEGIN + +statement ok +ALTER TABLE t ADD COLUMN b INT AS (a) STORED + +statement ok +ALTER TABLE t ALTER COLUMN b SET NOT NULL + +statement ok +COMMIT + +statement ok +BEGIN + +statement ok +ALTER TABLE t ADD COLUMN c INT + +statement ok +ALTER TABLE t ALTER COLUMN c SET NOT NULL + +statement error pgcode XXA00 validation of NOT NULL constraint failed: validation of CHECK "c IS NOT NULL" failed +COMMIT + +statement ok +DROP TABLE t + +# Test adding CHECK and NOT NULL constraints in the same transaction. +subtest check_and_not_null + +statement ok +CREATE TABLE t (a INT) + +statement ok +INSERT INTO t VALUES (1) + +statement ok +BEGIN + +statement ok +ALTER TABLE t ADD CHECK (a > 0) + +# Check for name collisions with the auto-generated NOT NULL check constraint name +statement ok +ALTER TABLE t ADD CONSTRAINT a_auto_not_null CHECK (a IS NOT NULL) + +statement ok +ALTER TABLE t ALTER COLUMN a SET NOT NULL + +statement ok +COMMIT + +statement ok +DROP TABLE t diff --git a/pkg/sql/parser/parse_test.go b/pkg/sql/parser/parse_test.go index ae45f20040f4..d60329c2f521 100644 --- a/pkg/sql/parser/parse_test.go +++ b/pkg/sql/parser/parse_test.go @@ -2881,7 +2881,6 @@ func TestUnimplementedSyntax(t *testing.T) { expected string }{ {`ALTER TABLE a ALTER CONSTRAINT foo`, 31632, `alter constraint`}, - {`ALTER TABLE a ALTER b SET NOT NULL`, 28751, ``}, {`CREATE AGGREGATE a`, 0, `create aggregate`}, {`CREATE CAST a`, 0, `create cast`}, diff --git a/pkg/sql/parser/sql.y b/pkg/sql/parser/sql.y index 25b35a666827..8bdd43a095ee 100644 --- a/pkg/sql/parser/sql.y +++ b/pkg/sql/parser/sql.y @@ -1551,7 +1551,10 @@ alter_table_cmd: $$.val = &tree.AlterTableDropStored{Column: tree.Name($3)} } // ALTER TABLE ALTER [COLUMN] SET NOT NULL -| ALTER opt_column column_name SET NOT NULL { return unimplementedWithIssue(sqllex, 28751) } +| ALTER opt_column column_name SET NOT NULL + { + $$.val = &tree.AlterTableSetNotNull{Column: tree.Name($3)} + } // ALTER TABLE DROP [COLUMN] IF EXISTS [RESTRICT|CASCADE] | DROP opt_column IF EXISTS column_name opt_drop_behavior { diff --git a/pkg/sql/schema_changer.go b/pkg/sql/schema_changer.go index c1511b392c5b..999a734fa91d 100644 --- a/pkg/sql/schema_changer.go +++ b/pkg/sql/schema_changer.go @@ -1503,9 +1503,9 @@ func (sc *SchemaChanger) maybeDropValidatingConstraint( ctx context.Context, desc *MutableTableDescriptor, constraint *sqlbase.ConstraintToUpdate, ) error { switch constraint.ConstraintType { - case sqlbase.ConstraintToUpdate_CHECK: + case sqlbase.ConstraintToUpdate_CHECK, sqlbase.ConstraintToUpdate_NOT_NULL: for j, c := range desc.Checks { - if c.Name == constraint.Name { + if c.Name == constraint.Check.Name { desc.Checks = append(desc.Checks[:j], desc.Checks[j+1:]...) return nil } @@ -1514,7 +1514,7 @@ func (sc *SchemaChanger) maybeDropValidatingConstraint( log.Infof( ctx, "attempted to drop constraint %s, but it hadn't been added to the table descriptor yet", - constraint.Name, + constraint.Check.Name, ) } case sqlbase.ConstraintToUpdate_FOREIGN_KEY: diff --git a/pkg/sql/sem/tree/alter_table.go b/pkg/sql/sem/tree/alter_table.go index 1e7aabde2d4d..197d7adfcc7b 100644 --- a/pkg/sql/sem/tree/alter_table.go +++ b/pkg/sql/sem/tree/alter_table.go @@ -59,6 +59,7 @@ func (*AlterTableDropColumn) alterTableCmd() {} func (*AlterTableDropConstraint) alterTableCmd() {} func (*AlterTableDropNotNull) alterTableCmd() {} func (*AlterTableDropStored) alterTableCmd() {} +func (*AlterTableSetNotNull) alterTableCmd() {} func (*AlterTableRenameColumn) alterTableCmd() {} func (*AlterTableRenameConstraint) alterTableCmd() {} func (*AlterTableRenameTable) alterTableCmd() {} @@ -75,6 +76,7 @@ var _ AlterTableCmd = &AlterTableDropColumn{} var _ AlterTableCmd = &AlterTableDropConstraint{} var _ AlterTableCmd = &AlterTableDropNotNull{} var _ AlterTableCmd = &AlterTableDropStored{} +var _ AlterTableCmd = &AlterTableSetNotNull{} var _ AlterTableCmd = &AlterTableRenameColumn{} var _ AlterTableCmd = &AlterTableRenameConstraint{} var _ AlterTableCmd = &AlterTableRenameTable{} @@ -317,6 +319,24 @@ func (node *AlterTableSetDefault) Format(ctx *FmtCtx) { } } +// AlterTableSetNotNull represents an ALTER COLUMN SET NOT NULL +// command. +type AlterTableSetNotNull struct { + Column Name +} + +// GetColumn implements the ColumnMutationCmd interface. +func (node *AlterTableSetNotNull) GetColumn() Name { + return node.Column +} + +// Format implements the NodeFormatter interface. +func (node *AlterTableSetNotNull) Format(ctx *FmtCtx) { + ctx.WriteString(" ALTER COLUMN ") + ctx.FormatNode(&node.Column) + ctx.WriteString(" SET NOT NULL") +} + // AlterTableDropNotNull represents an ALTER COLUMN DROP NOT NULL // command. type AlterTableDropNotNull struct { diff --git a/pkg/sql/sem/tree/stmt.go b/pkg/sql/sem/tree/stmt.go index 85b7f6409536..a36af920babf 100644 --- a/pkg/sql/sem/tree/stmt.go +++ b/pkg/sql/sem/tree/stmt.go @@ -850,6 +850,7 @@ func (n *AlterTableDropConstraint) String() string { return AsString(n) } func (n *AlterTableDropNotNull) String() string { return AsString(n) } func (n *AlterTableDropStored) String() string { return AsString(n) } func (n *AlterTableSetDefault) String() string { return AsString(n) } +func (n *AlterTableSetNotNull) String() string { return AsString(n) } func (n *AlterUserSetPassword) String() string { return AsString(n) } func (n *AlterSequence) String() string { return AsString(n) } func (n *Backup) String() string { return AsString(n) } diff --git a/pkg/sql/sqlbase/structured.go b/pkg/sql/sqlbase/structured.go index 9700e0e15018..ec4f24373c34 100644 --- a/pkg/sql/sqlbase/structured.go +++ b/pkg/sql/sqlbase/structured.go @@ -2388,6 +2388,18 @@ func (desc *MutableTableDescriptor) MakeMutationComplete(m DescriptorMutation) e return err } idx.ForeignKey.Validity = ConstraintValidity_Validated + case ConstraintToUpdate_NOT_NULL: + // Remove the dummy check constraint that was in place during validation + for i, c := range desc.Checks { + if c.Name == t.Constraint.Check.Name { + desc.Checks = append(desc.Checks[:i], desc.Checks[i+1:]...) + } + } + col, err := desc.FindColumnByID(t.Constraint.NotNullColumn) + if err != nil { + return err + } + col.Nullable = false default: return errors.Errorf("unsupported constraint type: %d", t.Constraint.ConstraintType) } @@ -2437,6 +2449,71 @@ func (desc *MutableTableDescriptor) AddForeignKeyValidationMutation( desc.addMutation(m) } +// makeNotNullCheckConstraint creates a dummy check constraint equivalent to a +// NOT NULL constraint on a column, so that NOT NULL constraints can be added +// and dropped correctly in the schema changer. This function mutates inuseNames +// to add the new constraint name. +func makeNotNullCheckConstraint( + colName string, colID ColumnID, inuseNames map[string]struct{}, +) *TableDescriptor_CheckConstraint { + name := fmt.Sprintf("%s_auto_not_null", colName) + // If generated name isn't unique, attempt to add a number to the end to + // get a unique name, as in generateNameForCheckConstraint(). + if _, ok := inuseNames[name]; ok { + i := 1 + for { + appended := fmt.Sprintf("%s%d", name, i) + if _, ok := inuseNames[appended]; !ok { + name = appended + break + } + i++ + } + } + if inuseNames != nil { + inuseNames[name] = struct{}{} + } + + expr := &tree.ComparisonExpr{ + Operator: tree.IsDistinctFrom, + Left: &tree.ColumnItem{ColumnName: tree.Name(colName)}, + Right: tree.DNull, + } + + return &TableDescriptor_CheckConstraint{ + Name: name, + Expr: tree.Serialize(expr), + Validity: ConstraintValidity_Validating, + ColumnIDs: []ColumnID{colID}, + IsNonNullConstraint: true, + } +} + +// AddNotNullValidationMutation adds a not null constraint validation mutation +// to desc.Mutations. Similarly to other schema elements, adding a non-null +// constraint requires a multi-state schema change, including a bulk validation +// step, before the Nullable flag can be set to false on the descriptor. This is +// done by adding a dummy check constraint of the form "x IS NOT NULL" that is +// treated like other check constraints being added, until the completion of the +// schema change, at which the check constraint is deleted. This function +// mutates inuseNames to add the new constraint name. +func (desc *MutableTableDescriptor) AddNotNullValidationMutation( + colName string, colID ColumnID, inuseNames map[string]struct{}, +) { + ck := makeNotNullCheckConstraint(colName, colID, inuseNames) + m := DescriptorMutation{ + Descriptor_: &DescriptorMutation_Constraint{ + Constraint: &ConstraintToUpdate{ + ConstraintType: ConstraintToUpdate_NOT_NULL, + NotNullColumn: colID, + Check: *ck, + }, + }, + Direction: DescriptorMutation_ADD, + } + desc.addMutation(m) +} + // AddColumnMutation adds a column mutation to desc.Mutations. Callers must take // care not to further mutate the column descriptor, since this method retains // a pointer to it. @@ -2484,12 +2561,24 @@ func (desc *MutableTableDescriptor) addMutation(m DescriptorMutation) { desc.Mutations = append(desc.Mutations, m) } +// IgnoreConstraints is used in MakeFirstMutationPublic to indicate that the +// table descriptor returned should not include newly added constraints, which +// is useful when passing the returned table descriptor to be used in +// validating constraints to be added. +const IgnoreConstraints = false + +// IncludeConstraints is used in MakeFirstMutationPublic to indicate that the +// table descriptor returned should include newly added constraints. +const IncludeConstraints = true + // MakeFirstMutationPublic creates a MutableTableDescriptor from the // ImmutableTableDescriptor by making the first mutation public. // This is super valuable when trying to run SQL over data associated // with a schema mutation that is still not yet public: Data validation, // error reporting. -func (desc *ImmutableTableDescriptor) MakeFirstMutationPublic() (*MutableTableDescriptor, error) { +func (desc *ImmutableTableDescriptor) MakeFirstMutationPublic( + includeConstraints bool, +) (*MutableTableDescriptor, error) { // Clone the ImmutableTable descriptor because we want to create an Immutable one. table := NewMutableExistingTableDescriptor(*protoutil.Clone(desc.TableDesc()).(*TableDescriptor)) mutationID := desc.Mutations[0].MutationID @@ -2500,8 +2589,10 @@ func (desc *ImmutableTableDescriptor) MakeFirstMutationPublic() (*MutableTableDe // of mutations if they have the mutation ID we're looking for. break } - if err := table.MakeMutationComplete(mutation); err != nil { - return nil, err + if includeConstraints || mutation.GetConstraint() == nil { + if err := table.MakeMutationComplete(mutation); err != nil { + return nil, err + } } i++ } diff --git a/pkg/sql/sqlbase/structured.pb.go b/pkg/sql/sqlbase/structured.pb.go index 16631ba23d14..2302954b66a5 100644 --- a/pkg/sql/sqlbase/structured.pb.go +++ b/pkg/sql/sqlbase/structured.pb.go @@ -67,7 +67,7 @@ func (x *ConstraintValidity) UnmarshalJSON(data []byte) error { return nil } func (ConstraintValidity) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{0} + return fileDescriptor_structured_a6ff21a8835b349b, []int{0} } type ForeignKeyReference_Action int32 @@ -112,7 +112,7 @@ func (x *ForeignKeyReference_Action) UnmarshalJSON(data []byte) error { return nil } func (ForeignKeyReference_Action) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{0, 0} + return fileDescriptor_structured_a6ff21a8835b349b, []int{0, 0} } // Match is the algorithm used to compare composite keys. @@ -152,7 +152,7 @@ func (x *ForeignKeyReference_Match) UnmarshalJSON(data []byte) error { return nil } func (ForeignKeyReference_Match) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{0, 1} + return fileDescriptor_structured_a6ff21a8835b349b, []int{0, 1} } // The direction of a column in the index. @@ -189,7 +189,7 @@ func (x *IndexDescriptor_Direction) UnmarshalJSON(data []byte) error { return nil } func (IndexDescriptor_Direction) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{5, 0} + return fileDescriptor_structured_a6ff21a8835b349b, []int{5, 0} } // The type of the index. @@ -226,7 +226,7 @@ func (x *IndexDescriptor_Type) UnmarshalJSON(data []byte) error { return nil } func (IndexDescriptor_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{5, 1} + return fileDescriptor_structured_a6ff21a8835b349b, []int{5, 1} } type ConstraintToUpdate_ConstraintType int32 @@ -234,15 +234,22 @@ type ConstraintToUpdate_ConstraintType int32 const ( ConstraintToUpdate_CHECK ConstraintToUpdate_ConstraintType = 0 ConstraintToUpdate_FOREIGN_KEY ConstraintToUpdate_ConstraintType = 1 + // NOT NULL constraints being added are represented by a dummy check + // constraint so that a multi-state schema change, including a bulk + // validation step, can occur. The check field contains the dummy + // constraint. + ConstraintToUpdate_NOT_NULL ConstraintToUpdate_ConstraintType = 2 ) var ConstraintToUpdate_ConstraintType_name = map[int32]string{ 0: "CHECK", 1: "FOREIGN_KEY", + 2: "NOT_NULL", } var ConstraintToUpdate_ConstraintType_value = map[string]int32{ "CHECK": 0, "FOREIGN_KEY": 1, + "NOT_NULL": 2, } func (x ConstraintToUpdate_ConstraintType) Enum() *ConstraintToUpdate_ConstraintType { @@ -262,7 +269,7 @@ func (x *ConstraintToUpdate_ConstraintType) UnmarshalJSON(data []byte) error { return nil } func (ConstraintToUpdate_ConstraintType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{6, 0} + return fileDescriptor_structured_a6ff21a8835b349b, []int{6, 0} } // A descriptor within a mutation is unavailable for reads, writes @@ -327,7 +334,7 @@ func (x *DescriptorMutation_State) UnmarshalJSON(data []byte) error { return nil } func (DescriptorMutation_State) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{7, 0} + return fileDescriptor_structured_a6ff21a8835b349b, []int{7, 0} } // Direction of mutation. @@ -370,7 +377,7 @@ func (x *DescriptorMutation_Direction) UnmarshalJSON(data []byte) error { return nil } func (DescriptorMutation_Direction) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{7, 1} + return fileDescriptor_structured_a6ff21a8835b349b, []int{7, 1} } // State is set if this TableDescriptor is in the process of being added or deleted. @@ -421,7 +428,7 @@ func (x *TableDescriptor_State) UnmarshalJSON(data []byte) error { return nil } func (TableDescriptor_State) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{8, 0} + return fileDescriptor_structured_a6ff21a8835b349b, []int{8, 0} } // AuditMode indicates which auditing actions to take when this table is used. @@ -458,7 +465,7 @@ func (x *TableDescriptor_AuditMode) UnmarshalJSON(data []byte) error { return nil } func (TableDescriptor_AuditMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{8, 1} + return fileDescriptor_structured_a6ff21a8835b349b, []int{8, 1} } type ForeignKeyReference struct { @@ -482,7 +489,7 @@ func (m *ForeignKeyReference) Reset() { *m = ForeignKeyReference{} } func (m *ForeignKeyReference) String() string { return proto.CompactTextString(m) } func (*ForeignKeyReference) ProtoMessage() {} func (*ForeignKeyReference) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{0} + return fileDescriptor_structured_a6ff21a8835b349b, []int{0} } func (m *ForeignKeyReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -529,7 +536,7 @@ func (m *ColumnDescriptor) Reset() { *m = ColumnDescriptor{} } func (m *ColumnDescriptor) String() string { return proto.CompactTextString(m) } func (*ColumnDescriptor) ProtoMessage() {} func (*ColumnDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{1} + return fileDescriptor_structured_a6ff21a8835b349b, []int{1} } func (m *ColumnDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -582,7 +589,7 @@ func (m *ColumnFamilyDescriptor) Reset() { *m = ColumnFamilyDescriptor{} func (m *ColumnFamilyDescriptor) String() string { return proto.CompactTextString(m) } func (*ColumnFamilyDescriptor) ProtoMessage() {} func (*ColumnFamilyDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{2} + return fileDescriptor_structured_a6ff21a8835b349b, []int{2} } func (m *ColumnFamilyDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -630,7 +637,7 @@ func (m *InterleaveDescriptor) Reset() { *m = InterleaveDescriptor{} } func (m *InterleaveDescriptor) String() string { return proto.CompactTextString(m) } func (*InterleaveDescriptor) ProtoMessage() {} func (*InterleaveDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{3} + return fileDescriptor_structured_a6ff21a8835b349b, []int{3} } func (m *InterleaveDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -676,7 +683,7 @@ func (m *InterleaveDescriptor_Ancestor) Reset() { *m = InterleaveDescrip func (m *InterleaveDescriptor_Ancestor) String() string { return proto.CompactTextString(m) } func (*InterleaveDescriptor_Ancestor) ProtoMessage() {} func (*InterleaveDescriptor_Ancestor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{3, 0} + return fileDescriptor_structured_a6ff21a8835b349b, []int{3, 0} } func (m *InterleaveDescriptor_Ancestor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -723,7 +730,7 @@ func (m *PartitioningDescriptor) Reset() { *m = PartitioningDescriptor{} func (m *PartitioningDescriptor) String() string { return proto.CompactTextString(m) } func (*PartitioningDescriptor) ProtoMessage() {} func (*PartitioningDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{4} + return fileDescriptor_structured_a6ff21a8835b349b, []int{4} } func (m *PartitioningDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -768,7 +775,7 @@ func (m *PartitioningDescriptor_List) Reset() { *m = PartitioningDescrip func (m *PartitioningDescriptor_List) String() string { return proto.CompactTextString(m) } func (*PartitioningDescriptor_List) ProtoMessage() {} func (*PartitioningDescriptor_List) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{4, 0} + return fileDescriptor_structured_a6ff21a8835b349b, []int{4, 0} } func (m *PartitioningDescriptor_List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -815,7 +822,7 @@ func (m *PartitioningDescriptor_Range) Reset() { *m = PartitioningDescri func (m *PartitioningDescriptor_Range) String() string { return proto.CompactTextString(m) } func (*PartitioningDescriptor_Range) ProtoMessage() {} func (*PartitioningDescriptor_Range) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{4, 1} + return fileDescriptor_structured_a6ff21a8835b349b, []int{4, 1} } func (m *PartitioningDescriptor_Range) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -949,7 +956,7 @@ func (m *IndexDescriptor) Reset() { *m = IndexDescriptor{} } func (m *IndexDescriptor) String() string { return proto.CompactTextString(m) } func (*IndexDescriptor) ProtoMessage() {} func (*IndexDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{5} + return fileDescriptor_structured_a6ff21a8835b349b, []int{5} } func (m *IndexDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -993,6 +1000,7 @@ type ConstraintToUpdate struct { Check TableDescriptor_CheckConstraint `protobuf:"bytes,3,opt,name=check" json:"check"` ForeignKey ForeignKeyReference `protobuf:"bytes,4,opt,name=foreign_key,json=foreignKey" json:"foreign_key"` ForeignKeyIndex IndexID `protobuf:"varint,5,opt,name=foreign_key_index,json=foreignKeyIndex,casttype=IndexID" json:"foreign_key_index"` + NotNullColumn ColumnID `protobuf:"varint,6,opt,name=not_null_column,json=notNullColumn,casttype=ColumnID" json:"not_null_column"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_sizecache int32 `json:"-"` } @@ -1001,7 +1009,7 @@ func (m *ConstraintToUpdate) Reset() { *m = ConstraintToUpdate{} } func (m *ConstraintToUpdate) String() string { return proto.CompactTextString(m) } func (*ConstraintToUpdate) ProtoMessage() {} func (*ConstraintToUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{6} + return fileDescriptor_structured_a6ff21a8835b349b, []int{6} } func (m *ConstraintToUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1057,7 +1065,7 @@ func (m *DescriptorMutation) Reset() { *m = DescriptorMutation{} } func (m *DescriptorMutation) String() string { return proto.CompactTextString(m) } func (*DescriptorMutation) ProtoMessage() {} func (*DescriptorMutation) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{7} + return fileDescriptor_structured_a6ff21a8835b349b, []int{7} } func (m *DescriptorMutation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1341,7 +1349,7 @@ func (m *TableDescriptor) Reset() { *m = TableDescriptor{} } func (m *TableDescriptor) String() string { return proto.CompactTextString(m) } func (*TableDescriptor) ProtoMessage() {} func (*TableDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{8} + return fileDescriptor_structured_a6ff21a8835b349b, []int{8} } func (m *TableDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1593,7 +1601,7 @@ func (m *TableDescriptor_SchemaChangeLease) Reset() { *m = TableDescript func (m *TableDescriptor_SchemaChangeLease) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_SchemaChangeLease) ProtoMessage() {} func (*TableDescriptor_SchemaChangeLease) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{8, 0} + return fileDescriptor_structured_a6ff21a8835b349b, []int{8, 0} } func (m *TableDescriptor_SchemaChangeLease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1624,6 +1632,7 @@ type TableDescriptor_CheckConstraint struct { Validity ConstraintValidity `protobuf:"varint,3,opt,name=validity,enum=cockroach.sql.sqlbase.ConstraintValidity" json:"validity"` // An ordered list of column IDs used by the check constraint. ColumnIDs []ColumnID `protobuf:"varint,5,rep,name=column_ids,json=columnIds,casttype=ColumnID" json:"column_ids,omitempty"` + IsNonNullConstraint bool `protobuf:"varint,6,opt,name=is_non_null_constraint,json=isNonNullConstraint" json:"is_non_null_constraint"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_sizecache int32 `json:"-"` } @@ -1632,7 +1641,7 @@ func (m *TableDescriptor_CheckConstraint) Reset() { *m = TableDescriptor func (m *TableDescriptor_CheckConstraint) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_CheckConstraint) ProtoMessage() {} func (*TableDescriptor_CheckConstraint) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{8, 1} + return fileDescriptor_structured_a6ff21a8835b349b, []int{8, 1} } func (m *TableDescriptor_CheckConstraint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1737,7 +1746,7 @@ func (m *TableDescriptor_NameInfo) Reset() { *m = TableDescriptor_NameIn func (m *TableDescriptor_NameInfo) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_NameInfo) ProtoMessage() {} func (*TableDescriptor_NameInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{8, 2} + return fileDescriptor_structured_a6ff21a8835b349b, []int{8, 2} } func (m *TableDescriptor_NameInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1779,7 +1788,7 @@ func (m *TableDescriptor_Reference) Reset() { *m = TableDescriptor_Refer func (m *TableDescriptor_Reference) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_Reference) ProtoMessage() {} func (*TableDescriptor_Reference) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{8, 3} + return fileDescriptor_structured_a6ff21a8835b349b, []int{8, 3} } func (m *TableDescriptor_Reference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1818,7 +1827,7 @@ func (m *TableDescriptor_MutationJob) Reset() { *m = TableDescriptor_Mut func (m *TableDescriptor_MutationJob) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_MutationJob) ProtoMessage() {} func (*TableDescriptor_MutationJob) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{8, 4} + return fileDescriptor_structured_a6ff21a8835b349b, []int{8, 4} } func (m *TableDescriptor_MutationJob) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1862,7 +1871,7 @@ func (m *TableDescriptor_SequenceOpts) Reset() { *m = TableDescriptor_Se func (m *TableDescriptor_SequenceOpts) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_SequenceOpts) ProtoMessage() {} func (*TableDescriptor_SequenceOpts) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{8, 5} + return fileDescriptor_structured_a6ff21a8835b349b, []int{8, 5} } func (m *TableDescriptor_SequenceOpts) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1898,7 +1907,7 @@ func (m *TableDescriptor_Replacement) Reset() { *m = TableDescriptor_Rep func (m *TableDescriptor_Replacement) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_Replacement) ProtoMessage() {} func (*TableDescriptor_Replacement) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{8, 6} + return fileDescriptor_structured_a6ff21a8835b349b, []int{8, 6} } func (m *TableDescriptor_Replacement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1937,7 +1946,7 @@ func (m *TableDescriptor_GCDescriptorMutation) Reset() { *m = TableDescr func (m *TableDescriptor_GCDescriptorMutation) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_GCDescriptorMutation) ProtoMessage() {} func (*TableDescriptor_GCDescriptorMutation) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{8, 7} + return fileDescriptor_structured_a6ff21a8835b349b, []int{8, 7} } func (m *TableDescriptor_GCDescriptorMutation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1978,7 +1987,7 @@ func (m *DatabaseDescriptor) Reset() { *m = DatabaseDescriptor{} } func (m *DatabaseDescriptor) String() string { return proto.CompactTextString(m) } func (*DatabaseDescriptor) ProtoMessage() {} func (*DatabaseDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{9} + return fileDescriptor_structured_a6ff21a8835b349b, []int{9} } func (m *DatabaseDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2038,7 +2047,7 @@ func (m *Descriptor) Reset() { *m = Descriptor{} } func (m *Descriptor) String() string { return proto.CompactTextString(m) } func (*Descriptor) ProtoMessage() {} func (*Descriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_f8b3ed7ae7e1cf8e, []int{10} + return fileDescriptor_structured_a6ff21a8835b349b, []int{10} } func (m *Descriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2735,6 +2744,9 @@ func (m *ConstraintToUpdate) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x28 i++ i = encodeVarintStructured(dAtA, i, uint64(m.ForeignKeyIndex)) + dAtA[i] = 0x30 + i++ + i = encodeVarintStructured(dAtA, i, uint64(m.NotNullColumn)) return i, nil } @@ -3144,6 +3156,14 @@ func (m *TableDescriptor_CheckConstraint) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintStructured(dAtA, i, uint64(num)) } } + dAtA[i] = 0x30 + i++ + if m.IsNonNullConstraint { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ return i, nil } @@ -3659,6 +3679,7 @@ func (m *ConstraintToUpdate) Size() (n int) { l = m.ForeignKey.Size() n += 1 + l + sovStructured(uint64(l)) n += 1 + sovStructured(uint64(m.ForeignKeyIndex)) + n += 1 + sovStructured(uint64(m.NotNullColumn)) return n } @@ -3843,6 +3864,7 @@ func (m *TableDescriptor_CheckConstraint) Size() (n int) { n += 1 + sovStructured(uint64(e)) } } + n += 2 return n } @@ -6183,6 +6205,25 @@ func (m *ConstraintToUpdate) Unmarshal(dAtA []byte) error { break } } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NotNullColumn", wireType) + } + m.NotNullColumn = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStructured + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.NotNullColumn |= (ColumnID(b) & 0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipStructured(dAtA[iNdEx:]) @@ -7577,6 +7618,26 @@ func (m *TableDescriptor_CheckConstraint) Unmarshal(dAtA []byte) error { } else { return fmt.Errorf("proto: wrong wireType = %d for field ColumnIDs", wireType) } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsNonNullConstraint", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStructured + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.IsNonNullConstraint = bool(v != 0) default: iNdEx = preIndex skippy, err := skipStructured(dAtA[iNdEx:]) @@ -8648,189 +8709,193 @@ var ( ) func init() { - proto.RegisterFile("sql/sqlbase/structured.proto", fileDescriptor_structured_f8b3ed7ae7e1cf8e) -} - -var fileDescriptor_structured_f8b3ed7ae7e1cf8e = []byte{ - // 2874 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0xcd, 0x73, 0x23, 0x47, - 0x15, 0xf7, 0xe8, 0x73, 0xf4, 0xf4, 0x35, 0xee, 0xfd, 0xc8, 0xac, 0xb2, 0xb1, 0xb5, 0x4a, 0x36, - 0x98, 0x7c, 0xc8, 0x1b, 0x2f, 0x81, 0x2d, 0x42, 0xa5, 0xd0, 0x97, 0xd7, 0xf2, 0xca, 0x92, 0x77, - 0x2c, 0xaf, 0x13, 0x2a, 0x30, 0x35, 0xd6, 0xb4, 0xed, 0xc9, 0x8e, 0x66, 0xb4, 0x33, 0x23, 0x63, - 0xff, 0x07, 0x39, 0x72, 0x82, 0x13, 0x29, 0x2a, 0xc5, 0x01, 0x8a, 0x2b, 0x07, 0xfe, 0x84, 0x1c, - 0x29, 0x4e, 0x14, 0x07, 0x17, 0x98, 0xe2, 0x0a, 0xf7, 0x14, 0x54, 0x51, 0xdd, 0xd3, 0x3d, 0x9a, - 0xb1, 0x25, 0x23, 0xef, 0x72, 0xd3, 0xbc, 0x7e, 0xef, 0xd7, 0xdd, 0xaf, 0xdf, 0xfb, 0xf5, 0x7b, - 0x2d, 0xb8, 0xeb, 0xbe, 0x30, 0x57, 0xdd, 0x17, 0xe6, 0xbe, 0xe6, 0xe2, 0x55, 0xd7, 0x73, 0xc6, - 0x03, 0x6f, 0xec, 0x60, 0xbd, 0x3a, 0x72, 0x6c, 0xcf, 0x46, 0xb7, 0x06, 0xf6, 0xe0, 0xb9, 0x63, - 0x6b, 0x83, 0xa3, 0xaa, 0xfb, 0xc2, 0xac, 0x32, 0xbd, 0x92, 0x3c, 0xf6, 0x0c, 0x73, 0xf5, 0xc8, - 0x1c, 0xac, 0x7a, 0xc6, 0x10, 0xbb, 0x9e, 0x36, 0x1c, 0xf9, 0x06, 0xa5, 0xd7, 0xc3, 0x70, 0x23, - 0xc7, 0x38, 0x36, 0x4c, 0x7c, 0x88, 0xd9, 0xe0, 0xcd, 0x43, 0xfb, 0xd0, 0xa6, 0x3f, 0x57, 0xc9, - 0x2f, 0x5f, 0x5a, 0xf9, 0x77, 0x02, 0x6e, 0xac, 0xdb, 0x0e, 0x36, 0x0e, 0xad, 0x27, 0xf8, 0x54, - 0xc1, 0x07, 0xd8, 0xc1, 0xd6, 0x00, 0xa3, 0x32, 0x24, 0x3d, 0x6d, 0xdf, 0xc4, 0xb2, 0x50, 0x16, - 0x56, 0xf2, 0x75, 0xf8, 0xfa, 0x6c, 0x79, 0xe1, 0x9b, 0xb3, 0xe5, 0x58, 0xbb, 0xa9, 0xf8, 0x03, - 0xe8, 0x3e, 0x24, 0x0d, 0x4b, 0xc7, 0x27, 0x72, 0x8c, 0x6a, 0x14, 0x99, 0x46, 0xba, 0x4d, 0x84, - 0x44, 0x8d, 0x8e, 0x22, 0x19, 0x12, 0x96, 0x36, 0xc4, 0x72, 0xbc, 0x2c, 0xac, 0x64, 0xea, 0x09, - 0xa2, 0xa5, 0x50, 0x09, 0x7a, 0x02, 0xe2, 0xb1, 0x66, 0x1a, 0xba, 0xe1, 0x9d, 0xca, 0x89, 0xb2, - 0xb0, 0x52, 0x58, 0xfb, 0x76, 0x75, 0xea, 0x8e, 0xab, 0x0d, 0xdb, 0x72, 0x3d, 0x47, 0x33, 0x2c, - 0xef, 0x19, 0x33, 0x60, 0x40, 0x01, 0x00, 0x7a, 0x00, 0x8b, 0xee, 0x91, 0xe6, 0x60, 0x5d, 0x1d, - 0x39, 0xf8, 0xc0, 0x38, 0x51, 0x4d, 0x6c, 0xc9, 0xc9, 0xb2, 0xb0, 0x92, 0x64, 0xaa, 0x45, 0x7f, - 0x78, 0x9b, 0x8e, 0x76, 0xb0, 0x85, 0xfa, 0x90, 0xb1, 0x2d, 0x55, 0xc7, 0x26, 0xf6, 0xb0, 0x9c, - 0xa2, 0xf3, 0x7f, 0x30, 0x63, 0xfe, 0x29, 0x0e, 0xaa, 0xd6, 0x06, 0x9e, 0x61, 0x5b, 0x7c, 0x1d, - 0xb6, 0xd5, 0xa4, 0x40, 0x0c, 0x75, 0x3c, 0xd2, 0x35, 0x0f, 0xcb, 0xe9, 0x57, 0x46, 0xdd, 0xa5, - 0x40, 0xa8, 0x03, 0xc9, 0xa1, 0xe6, 0x0d, 0x8e, 0x64, 0x91, 0x22, 0x3e, 0xb8, 0x06, 0xe2, 0x16, - 0xb1, 0x63, 0x80, 0x3e, 0x48, 0x65, 0x0f, 0x52, 0xfe, 0x3c, 0x28, 0x0f, 0x99, 0x6e, 0x4f, 0xad, - 0x35, 0xfa, 0xed, 0x5e, 0x57, 0x5a, 0x40, 0x39, 0x10, 0x95, 0xd6, 0x4e, 0x5f, 0x69, 0x37, 0xfa, - 0x92, 0x40, 0xbe, 0x76, 0x5a, 0x7d, 0xb5, 0xbb, 0xdb, 0xe9, 0x48, 0x31, 0x54, 0x84, 0x2c, 0xf9, - 0x6a, 0xb6, 0xd6, 0x6b, 0xbb, 0x9d, 0xbe, 0x14, 0x47, 0x59, 0x48, 0x37, 0x6a, 0x3b, 0x8d, 0x5a, - 0xb3, 0x25, 0x25, 0x4a, 0x89, 0xdf, 0xfc, 0x7a, 0x69, 0xa1, 0xf2, 0x00, 0x92, 0x74, 0x3a, 0x04, - 0x90, 0xda, 0x69, 0x6f, 0x6d, 0x77, 0x5a, 0xd2, 0x02, 0x12, 0x21, 0xb1, 0x4e, 0x20, 0x04, 0x62, - 0xb1, 0x5d, 0x53, 0xfa, 0xed, 0x5a, 0x47, 0x8a, 0x31, 0x8b, 0x7f, 0xc6, 0x40, 0x6a, 0xd8, 0xe6, - 0x78, 0x68, 0x35, 0xb1, 0x3b, 0x70, 0x8c, 0x91, 0x67, 0x3b, 0x41, 0xc8, 0x08, 0x97, 0x42, 0xe6, - 0x6d, 0x88, 0x19, 0x3a, 0x0b, 0xb8, 0xdb, 0x44, 0x7e, 0x4e, 0x43, 0xf2, 0x9b, 0xb3, 0x65, 0xd1, - 0x47, 0x69, 0x37, 0x95, 0x98, 0xa1, 0xa3, 0x0e, 0x24, 0xbc, 0xd3, 0x91, 0x1f, 0x74, 0xb9, 0xfa, - 0x23, 0xa2, 0xf9, 0x97, 0xb3, 0xe5, 0x07, 0x87, 0x86, 0x77, 0x34, 0xde, 0xaf, 0x0e, 0xec, 0xe1, - 0x6a, 0xe0, 0x40, 0x7d, 0x7f, 0xf2, 0x7b, 0x75, 0xf4, 0xfc, 0x90, 0xe4, 0xcf, 0x2a, 0x31, 0x76, - 0xab, 0x7d, 0x85, 0xa2, 0xa0, 0x32, 0x88, 0xd6, 0xd8, 0x34, 0x69, 0x3a, 0x90, 0x40, 0x15, 0xf9, - 0xf9, 0x70, 0x29, 0xba, 0x07, 0x39, 0x1d, 0x1f, 0x68, 0x63, 0xd3, 0x53, 0xf1, 0xc9, 0xc8, 0xa1, - 0x81, 0x97, 0x51, 0xb2, 0x4c, 0xd6, 0x3a, 0x19, 0x39, 0xe8, 0x2e, 0xa4, 0x8e, 0x0c, 0x5d, 0xc7, - 0x16, 0x8d, 0x35, 0x0e, 0xc1, 0x64, 0x68, 0x0d, 0x16, 0xc7, 0x2e, 0x76, 0x55, 0x17, 0xbf, 0x18, - 0x93, 0x63, 0x53, 0x0d, 0xdd, 0x95, 0xa1, 0x1c, 0x5f, 0xc9, 0xd7, 0x53, 0x2c, 0xed, 0x8a, 0x44, - 0x61, 0x87, 0x8d, 0xb7, 0x75, 0x97, 0x4c, 0x3a, 0xb0, 0x87, 0xa3, 0xb1, 0x87, 0xfd, 0x49, 0xb3, - 0xfe, 0xa4, 0x4c, 0x46, 0x26, 0xdd, 0x4c, 0x88, 0xa2, 0x94, 0xd9, 0x4c, 0x88, 0x19, 0x09, 0x36, - 0x13, 0x62, 0x5a, 0x12, 0x2b, 0x5f, 0xc4, 0xe0, 0xb6, 0xef, 0xaa, 0x75, 0x6d, 0x68, 0x98, 0xa7, - 0xaf, 0xea, 0x76, 0x1f, 0x85, 0xb9, 0x9d, 0xae, 0x88, 0x60, 0xab, 0xc4, 0xcc, 0x95, 0xe3, 0xe5, - 0xb8, 0xbf, 0x22, 0x22, 0xeb, 0x12, 0x11, 0x7a, 0x04, 0xc0, 0x54, 0xc8, 0x0e, 0x13, 0x74, 0x87, - 0x77, 0xce, 0xcf, 0x96, 0x33, 0xfc, 0xfc, 0xdc, 0xc8, 0x61, 0x66, 0x7c, 0x65, 0xb2, 0xdd, 0x1e, - 0x2c, 0x72, 0x1f, 0x07, 0x08, 0xd4, 0xd1, 0xf9, 0xfa, 0x9b, 0x6c, 0x4d, 0xc5, 0xa6, 0xaf, 0xc0, - 0xcd, 0x23, 0x50, 0x45, 0x3d, 0x32, 0xa8, 0x57, 0x7e, 0x17, 0x83, 0x9b, 0x6d, 0xcb, 0xc3, 0x8e, - 0x89, 0xb5, 0x63, 0x1c, 0x72, 0xc4, 0x27, 0x90, 0xd1, 0xac, 0x01, 0x76, 0x3d, 0xdb, 0x71, 0x65, - 0xa1, 0x1c, 0x5f, 0xc9, 0xae, 0x7d, 0x67, 0x46, 0xc6, 0x4d, 0xb3, 0xaf, 0xd6, 0x98, 0x31, 0xf3, - 0xe1, 0x04, 0xac, 0xf4, 0x07, 0x01, 0x44, 0x3e, 0x8a, 0x1e, 0x80, 0x48, 0x99, 0x94, 0xec, 0xc3, - 0x67, 0xd9, 0x5b, 0x6c, 0x1f, 0xe9, 0x3e, 0x91, 0xd3, 0xf5, 0x93, 0x93, 0x4f, 0x53, 0xb5, 0xb6, - 0x8e, 0x3e, 0x04, 0x91, 0x92, 0xaa, 0x1a, 0x9c, 0x46, 0x89, 0x5b, 0x30, 0xd6, 0x0d, 0x13, 0x70, - 0x9a, 0xea, 0xb6, 0x75, 0xd4, 0x98, 0xc6, 0x8d, 0x71, 0x6a, 0xff, 0x1a, 0xf7, 0xdc, 0x4e, 0x94, - 0x1d, 0x2f, 0xd1, 0x65, 0xe5, 0x1f, 0x71, 0xb8, 0xbd, 0xad, 0x39, 0x9e, 0x41, 0x88, 0xc3, 0xb0, - 0x0e, 0x43, 0xfe, 0xba, 0x0f, 0x59, 0x6b, 0x3c, 0x64, 0xa7, 0xe2, 0xb2, 0xbd, 0xf8, 0x7b, 0x07, - 0x6b, 0x3c, 0xf4, 0x1d, 0xee, 0x92, 0xa4, 0x34, 0x0d, 0xd7, 0x93, 0x63, 0xd4, 0xa3, 0x6b, 0x33, - 0x3c, 0x3a, 0x7d, 0x8e, 0x6a, 0xc7, 0x70, 0x3d, 0x1e, 0x93, 0x04, 0x05, 0xf5, 0x20, 0xe9, 0x68, - 0xd6, 0x21, 0xa6, 0x41, 0x96, 0x5d, 0x7b, 0x78, 0x3d, 0x38, 0x85, 0x98, 0x72, 0x56, 0xa4, 0x38, - 0xa5, 0x5f, 0x08, 0x90, 0x20, 0xb3, 0x5c, 0x91, 0x07, 0xb7, 0x21, 0x75, 0xac, 0x99, 0x63, 0xec, - 0xd2, 0x3d, 0xe4, 0x14, 0xf6, 0x85, 0x7e, 0x0c, 0x45, 0x77, 0xbc, 0x3f, 0x0a, 0x4d, 0x45, 0xdd, - 0x9b, 0x5d, 0x7b, 0xff, 0x5a, 0xab, 0x0a, 0x6e, 0xaa, 0x28, 0x56, 0xe9, 0x39, 0x24, 0xe9, 0x7a, - 0xaf, 0x58, 0xd9, 0x3d, 0xc8, 0x79, 0xb6, 0x8a, 0x4f, 0x06, 0xe6, 0xd8, 0x35, 0x8e, 0x31, 0x8d, - 0x8e, 0x9c, 0x92, 0xf5, 0xec, 0x16, 0x17, 0xa1, 0xfb, 0x50, 0x38, 0x70, 0xec, 0xa1, 0x6a, 0x58, - 0x5c, 0x89, 0xb2, 0xa3, 0x92, 0x27, 0xd2, 0x36, 0x17, 0x56, 0xfe, 0x23, 0x42, 0x91, 0x46, 0xd0, - 0x5c, 0xcc, 0x70, 0x3f, 0xc4, 0x0c, 0xb7, 0x22, 0xcc, 0x10, 0x84, 0x21, 0x21, 0x86, 0xbb, 0x90, - 0x1a, 0x5b, 0xc6, 0x8b, 0xb1, 0x3f, 0x67, 0x40, 0x7e, 0xbe, 0xec, 0x12, 0x6d, 0x24, 0x2e, 0xd3, - 0xc6, 0x7b, 0x80, 0x48, 0xce, 0x60, 0x35, 0xa2, 0x98, 0xa4, 0x8a, 0x12, 0x1d, 0x69, 0xcc, 0x24, - 0x99, 0xd4, 0x35, 0x48, 0x66, 0x03, 0x24, 0x7c, 0xe2, 0x39, 0x9a, 0x1a, 0xb2, 0x4f, 0x53, 0xfb, - 0xa5, 0xf3, 0xb3, 0xe5, 0x42, 0x8b, 0x8c, 0x4d, 0x07, 0x29, 0xe0, 0xd0, 0x98, 0x4e, 0x62, 0x62, - 0x91, 0x61, 0xe8, 0x86, 0x83, 0xe9, 0x75, 0xeb, 0xca, 0x62, 0x39, 0x7e, 0xc5, 0xf5, 0x7d, 0xc1, - 0xed, 0xd5, 0x26, 0x37, 0x54, 0x24, 0x1f, 0x2a, 0x10, 0xb8, 0xe8, 0x29, 0x64, 0x0f, 0xfc, 0xdb, - 0x5e, 0x7d, 0x8e, 0x4f, 0xe5, 0x0c, 0x0d, 0xb7, 0x77, 0xe6, 0xaf, 0x0b, 0x78, 0x7e, 0x1e, 0x04, - 0x43, 0x68, 0x17, 0xf2, 0x0e, 0x1f, 0xd6, 0xd5, 0xfd, 0x53, 0x7a, 0xff, 0xbc, 0x0c, 0x68, 0x6e, - 0x02, 0x53, 0x3f, 0x45, 0x4f, 0x01, 0x8c, 0x80, 0x25, 0xe9, 0x25, 0x95, 0x5d, 0x7b, 0xf7, 0x1a, - 0x74, 0xca, 0x57, 0x3a, 0x01, 0x41, 0x7b, 0x50, 0x98, 0x7c, 0xd1, 0xa5, 0xe6, 0x5e, 0x72, 0xa9, - 0xf9, 0x10, 0x4e, 0xfd, 0x14, 0xf5, 0xe1, 0x26, 0xb9, 0x3e, 0x6d, 0xd7, 0xf0, 0x70, 0x38, 0x04, - 0xf2, 0x34, 0x04, 0x2a, 0xe7, 0x67, 0xcb, 0xa8, 0xc1, 0xc7, 0xa7, 0x87, 0x01, 0x1a, 0x5c, 0x18, - 0xf7, 0x83, 0x2a, 0x12, 0xbc, 0x04, 0xb1, 0x30, 0x09, 0xaa, 0x9d, 0x49, 0xf8, 0x5e, 0x0a, 0xaa, - 0x50, 0x68, 0x13, 0xa4, 0x3d, 0xc8, 0x45, 0x58, 0xa6, 0xf8, 0xf2, 0x2c, 0x13, 0x01, 0x42, 0x2d, - 0x56, 0x30, 0x49, 0xb4, 0xbe, 0x7c, 0x77, 0xce, 0x00, 0xed, 0x9f, 0x8e, 0xb8, 0x23, 0xa9, 0x79, - 0x65, 0x09, 0x32, 0x41, 0x8c, 0xa2, 0x34, 0xc4, 0x6b, 0x3b, 0x0d, 0xbf, 0x02, 0x6c, 0xb6, 0x76, - 0x1a, 0x92, 0x50, 0xb9, 0x07, 0x09, 0x62, 0x43, 0x2a, 0xc1, 0xf5, 0x9e, 0xb2, 0x57, 0x53, 0x9a, - 0x7e, 0xd5, 0xd9, 0xee, 0x3e, 0x6b, 0x29, 0xfd, 0x56, 0x53, 0x12, 0x2a, 0xbf, 0x8d, 0x03, 0x9a, - 0xd4, 0xfb, 0x7d, 0x9b, 0x55, 0xc0, 0x87, 0x50, 0x1c, 0x04, 0x52, 0x95, 0xae, 0x55, 0x28, 0xc7, - 0x56, 0x0a, 0x6b, 0x8f, 0xfe, 0x67, 0xcf, 0xc0, 0x31, 0xc2, 0xa2, 0xc9, 0xc2, 0x0b, 0x83, 0x88, - 0x34, 0xe0, 0xba, 0x58, 0x39, 0x76, 0x81, 0xeb, 0x14, 0x48, 0x0e, 0x8e, 0xf0, 0xe0, 0x39, 0xe3, - 0xf6, 0xef, 0xce, 0x98, 0x98, 0xde, 0xdd, 0x21, 0x27, 0x35, 0x88, 0xcd, 0x64, 0x6a, 0x7e, 0xe9, - 0x50, 0xa8, 0x8b, 0x69, 0x9c, 0xf8, 0x3f, 0xa4, 0xf1, 0x47, 0xb0, 0x18, 0x82, 0x54, 0xfd, 0x1e, - 0x2d, 0x39, 0xbd, 0x47, 0x2b, 0x4e, 0xec, 0xa8, 0xa8, 0xf2, 0x1e, 0x14, 0xa2, 0x5e, 0x42, 0x19, - 0x48, 0x36, 0x36, 0x5a, 0x8d, 0x27, 0xd2, 0x02, 0x69, 0x01, 0xd6, 0x7b, 0x4a, 0xab, 0xfd, 0xb8, - 0xab, 0x3e, 0x69, 0x7d, 0x2a, 0x09, 0x95, 0x7f, 0x25, 0x00, 0x4d, 0x76, 0xba, 0x35, 0xf6, 0x34, - 0x7a, 0xf0, 0x35, 0x48, 0xf9, 0x91, 0x4e, 0x2f, 0x8c, 0xec, 0xda, 0xb7, 0x66, 0x1e, 0x51, 0xb4, - 0xf0, 0xdf, 0x58, 0x50, 0x98, 0x21, 0xfa, 0x38, 0xdc, 0x5c, 0x66, 0xd7, 0xde, 0x9e, 0x2f, 0x20, - 0x37, 0x16, 0x78, 0xd7, 0xf9, 0x04, 0x92, 0xae, 0x47, 0x5a, 0xb0, 0x38, 0x0d, 0xe8, 0xd5, 0x19, - 0xf6, 0x97, 0x17, 0x5f, 0xdd, 0x21, 0x66, 0xfc, 0x90, 0x28, 0x06, 0xda, 0x83, 0x4c, 0xc0, 0xe1, - 0xac, 0x53, 0x7d, 0x38, 0x3f, 0x60, 0x90, 0x10, 0xbc, 0x1c, 0x0c, 0xb0, 0x50, 0x0d, 0xb2, 0x43, - 0xa6, 0x36, 0x29, 0x66, 0xcb, 0xec, 0x1a, 0x05, 0x8e, 0x40, 0xaf, 0xd3, 0xd0, 0x97, 0x02, 0xdc, - 0xa8, 0xad, 0x93, 0xde, 0xc4, 0xb1, 0x4d, 0x73, 0x5f, 0x1b, 0x3c, 0xa7, 0xed, 0x66, 0xd0, 0x9b, - 0x70, 0x29, 0x7a, 0x42, 0x2e, 0x43, 0x7e, 0xa4, 0xb4, 0x81, 0xcc, 0xce, 0xd1, 0x68, 0xf3, 0xa4, - 0xd9, 0x58, 0x50, 0x42, 0xe6, 0x95, 0x1f, 0x42, 0x92, 0x3a, 0x88, 0x64, 0xf0, 0x6e, 0xf7, 0x49, - 0xb7, 0xb7, 0xd7, 0xf5, 0x03, 0xa3, 0xd9, 0xea, 0xb4, 0xfa, 0x2d, 0xb5, 0xd7, 0xed, 0x7c, 0x2a, - 0x09, 0xe8, 0x0e, 0xdc, 0x62, 0x82, 0x5a, 0xb7, 0xa9, 0xee, 0x29, 0x6d, 0x3e, 0x14, 0xab, 0xac, - 0x84, 0x29, 0x42, 0x84, 0x44, 0xb7, 0xd7, 0x25, 0x5d, 0x22, 0x21, 0x8b, 0x66, 0x53, 0x12, 0x28, - 0x59, 0x28, 0xbd, 0x6d, 0x29, 0x56, 0xcf, 0x01, 0xe8, 0x81, 0x3b, 0x37, 0x13, 0x62, 0x4a, 0x4a, - 0x57, 0x7e, 0xf9, 0x3a, 0x14, 0x2f, 0x24, 0xd8, 0x15, 0xd5, 0x49, 0x99, 0x56, 0x27, 0x7e, 0xa5, - 0x2b, 0x45, 0xaa, 0x93, 0x18, 0x2b, 0x4c, 0x1e, 0x42, 0x66, 0xa4, 0x39, 0xd8, 0xf2, 0x88, 0xff, - 0x13, 0x91, 0x06, 0x47, 0xdc, 0xa6, 0x03, 0x81, 0xba, 0xe8, 0x2b, 0xb6, 0x89, 0x51, 0xfa, 0x18, - 0x3b, 0x2e, 0x89, 0x06, 0xff, 0xc8, 0xee, 0xb0, 0xbc, 0x5a, 0x9c, 0xac, 0xea, 0x99, 0xaf, 0xa0, - 0x70, 0x4d, 0xb4, 0x0d, 0x8b, 0x43, 0x5b, 0x37, 0x0e, 0x8c, 0x81, 0x7f, 0xde, 0x9e, 0x31, 0xf4, - 0x1f, 0x08, 0xb2, 0x6b, 0x6f, 0x84, 0x4e, 0x63, 0xec, 0x19, 0x66, 0xf5, 0xc8, 0x1c, 0x54, 0xfb, - 0xfc, 0x6d, 0x87, 0xed, 0x48, 0x0a, 0x5b, 0x93, 0x41, 0xf4, 0x18, 0xd2, 0xbc, 0xe4, 0x16, 0xe9, - 0xf5, 0x37, 0x6f, 0x9e, 0x31, 0x44, 0x6e, 0x8d, 0xd6, 0xa1, 0x60, 0xe1, 0x93, 0x70, 0x5b, 0x95, - 0x89, 0x44, 0x62, 0xae, 0x8b, 0x4f, 0xa6, 0xf7, 0x54, 0x39, 0x6b, 0x32, 0xa2, 0xa3, 0xa7, 0x90, - 0x1f, 0x39, 0xc6, 0x50, 0x73, 0x38, 0xeb, 0xc0, 0x75, 0x92, 0x37, 0xb8, 0x97, 0x7c, 0x08, 0x3a, - 0x8a, 0xd6, 0xc1, 0xef, 0x62, 0xb0, 0x2b, 0x67, 0xe9, 0x1e, 0xaf, 0x07, 0xc6, 0x8d, 0x51, 0x1d, - 0xf2, 0x74, 0x8b, 0x41, 0xfb, 0x94, 0xa3, 0x3b, 0x5c, 0x62, 0x3b, 0xcc, 0x92, 0x1d, 0x4e, 0x69, - 0xa1, 0xb2, 0x56, 0x20, 0xd7, 0xd1, 0x26, 0x40, 0xf0, 0xa6, 0x46, 0x4a, 0x82, 0xab, 0xa8, 0x7a, - 0x9b, 0x2b, 0x4e, 0x96, 0xa4, 0x84, 0xac, 0xd1, 0x16, 0x64, 0x78, 0x12, 0xfb, 0xb5, 0xc0, 0xec, - 0x9c, 0xbc, 0x4c, 0x29, 0x9c, 0x48, 0x02, 0x04, 0xd4, 0x85, 0xa4, 0x89, 0x35, 0x17, 0xb3, 0x82, - 0xe0, 0xd1, 0x9c, 0x57, 0xd3, 0xce, 0xe0, 0x08, 0x0f, 0xb5, 0xc6, 0x11, 0x69, 0x2e, 0x3a, 0xc4, - 0x5e, 0xf1, 0x61, 0x50, 0x17, 0x24, 0xea, 0xae, 0x30, 0x3b, 0x49, 0xd4, 0x63, 0x6f, 0x31, 0x8f, - 0x15, 0x88, 0xc7, 0x66, 0x32, 0x14, 0x8d, 0xa7, 0xad, 0x09, 0x4b, 0xfd, 0x00, 0x0a, 0x07, 0xb6, - 0x33, 0xd4, 0x3c, 0x95, 0x27, 0xce, 0xe2, 0xa4, 0x65, 0xf8, 0xe6, 0x6c, 0x39, 0xbf, 0x4e, 0x47, - 0x79, 0xd2, 0xe4, 0x0f, 0xc2, 0x9f, 0x68, 0x83, 0x93, 0xf9, 0x0d, 0xca, 0xbd, 0xef, 0xcd, 0xbb, - 0xbb, 0xcb, 0x4c, 0xde, 0x85, 0x14, 0xbd, 0x77, 0x5d, 0xf9, 0x26, 0xf5, 0xf9, 0x4b, 0xde, 0xe1, - 0x0a, 0x43, 0x41, 0x9f, 0x41, 0x41, 0x27, 0x12, 0xc3, 0x3a, 0x64, 0x2d, 0xc9, 0x2d, 0x8a, 0xbb, - 0x3a, 0x27, 0x2e, 0x69, 0x57, 0xda, 0xd6, 0x81, 0xcd, 0xab, 0x51, 0x0e, 0xe6, 0xb7, 0x31, 0x3d, - 0x10, 0x0f, 0xb4, 0xa1, 0x61, 0x1a, 0xd8, 0x95, 0x6f, 0x53, 0xdc, 0xf7, 0xaf, 0xcc, 0xf0, 0x8b, - 0x2f, 0x3a, 0xfc, 0x2a, 0xe0, 0x20, 0x41, 0xa2, 0x53, 0xc1, 0x29, 0x39, 0xd4, 0xd7, 0x2e, 0x27, - 0x3a, 0x7f, 0xd1, 0x89, 0xbc, 0xee, 0xd0, 0x44, 0x67, 0x5f, 0x3a, 0x7a, 0x13, 0xe0, 0xd8, 0xc0, - 0x3f, 0x55, 0x5f, 0x8c, 0xb1, 0x73, 0x2a, 0xcb, 0x21, 0xde, 0xcd, 0x10, 0xf9, 0x53, 0x22, 0x46, - 0x1f, 0x40, 0x46, 0xc7, 0x23, 0x6c, 0xe9, 0x6e, 0xcf, 0x92, 0xef, 0xd0, 0x72, 0xf7, 0x06, 0xe9, - 0xc1, 0x9a, 0x5c, 0xc8, 0x78, 0x75, 0xa2, 0x85, 0x3e, 0x87, 0x9c, 0xff, 0x81, 0xf5, 0x9e, 0x55, - 0x3f, 0x95, 0x4b, 0x74, 0xd3, 0x0f, 0xe6, 0x74, 0xe6, 0xa4, 0x28, 0xba, 0xc9, 0xf7, 0xd3, 0x0c, - 0xa1, 0x29, 0x11, 0x6c, 0xf4, 0x19, 0xe4, 0x78, 0x74, 0x6f, 0xda, 0xfb, 0xae, 0xfc, 0xfa, 0x95, - 0xaf, 0x12, 0x17, 0xe7, 0xda, 0x9a, 0x98, 0x72, 0xde, 0x0a, 0xa3, 0xa1, 0x4f, 0x20, 0x1f, 0x3c, - 0xe5, 0xd9, 0x23, 0xcf, 0x95, 0xef, 0xd2, 0xc4, 0x7c, 0x38, 0x6f, 0xe8, 0x32, 0xdb, 0xde, 0xc8, - 0x73, 0x95, 0x9c, 0x1b, 0xfa, 0x42, 0xf7, 0x20, 0xa3, 0x3b, 0xf6, 0xc8, 0xbf, 0x3f, 0xde, 0x28, - 0x0b, 0x2b, 0x71, 0x7e, 0xcc, 0x44, 0x4c, 0x2f, 0x06, 0x15, 0x0a, 0x0e, 0x1e, 0x99, 0xda, 0x00, - 0x0f, 0xc9, 0xcd, 0x66, 0x1f, 0xc8, 0x4b, 0x74, 0xf6, 0xb5, 0xb9, 0x1d, 0x19, 0x18, 0xf3, 0xc0, - 0x0c, 0xe1, 0xf5, 0x0e, 0xd0, 0x2e, 0x80, 0x36, 0xd6, 0x0d, 0x4f, 0x1d, 0xda, 0x3a, 0x96, 0x97, - 0xaf, 0x7c, 0x93, 0xbe, 0x08, 0x5e, 0x23, 0x86, 0x5b, 0xb6, 0x8e, 0x83, 0xd7, 0x31, 0x2e, 0x40, - 0x1f, 0x40, 0x96, 0x6e, 0xed, 0x73, 0x7b, 0x9f, 0xc4, 0x66, 0x99, 0x6e, 0x6e, 0x91, 0x9d, 0x65, - 0xa6, 0xe9, 0xd8, 0xa3, 0x4d, 0x7b, 0x9f, 0x46, 0x0c, 0xfb, 0xa9, 0x23, 0x17, 0x72, 0x87, 0x03, - 0x75, 0x42, 0xa5, 0xf7, 0xe8, 0x29, 0x7e, 0x34, 0xe7, 0x5a, 0x1e, 0x37, 0xa6, 0x90, 0xeb, 0x0d, - 0x7e, 0x27, 0x3c, 0x6e, 0x70, 0x99, 0xab, 0x64, 0x0f, 0x07, 0xc1, 0x47, 0xe9, 0x2b, 0x01, 0x16, - 0x2f, 0x51, 0x27, 0xfa, 0x09, 0xa4, 0x2d, 0x5b, 0x0f, 0xbd, 0xe6, 0xb5, 0x18, 0x50, 0xaa, 0x6b, - 0xeb, 0xfe, 0x63, 0xde, 0xc3, 0xb9, 0x1e, 0xa0, 0xe9, 0xaf, 0xd1, 0x7e, 0xd5, 0x37, 0x53, 0x52, - 0x04, 0xb5, 0xad, 0xa3, 0xf7, 0xa1, 0x88, 0x4f, 0x46, 0x86, 0x13, 0x2a, 0x1f, 0x62, 0xa1, 0xe3, - 0x2f, 0x4c, 0x06, 0x49, 0x10, 0x94, 0xfe, 0x24, 0x40, 0xf1, 0x02, 0x6d, 0x91, 0x4a, 0x89, 0xbe, - 0x14, 0x47, 0x2a, 0x25, 0x22, 0x09, 0x75, 0x3d, 0x57, 0xfd, 0x4b, 0x13, 0x7f, 0xd5, 0x7f, 0x69, - 0xa2, 0x0f, 0x33, 0xc9, 0xf9, 0x1f, 0x66, 0x36, 0x13, 0x62, 0x42, 0x4a, 0x96, 0x3e, 0x05, 0x91, - 0x53, 0x66, 0xb4, 0x74, 0x13, 0xe6, 0x2c, 0xdd, 0x66, 0xee, 0xb3, 0xf4, 0xa5, 0x00, 0x99, 0xf0, - 0xdf, 0x5f, 0xb1, 0x00, 0x75, 0x7a, 0xe5, 0xf8, 0x92, 0x6f, 0xb1, 0x51, 0x0f, 0xc4, 0xe7, 0xf7, - 0x40, 0xe9, 0x18, 0xb2, 0x21, 0xd6, 0xb9, 0xd8, 0x3b, 0x08, 0x2f, 0xd1, 0x3b, 0xbc, 0x05, 0x29, - 0x96, 0x6a, 0x7e, 0x20, 0xe5, 0x99, 0x75, 0xd2, 0x4f, 0xb3, 0xe4, 0xe7, 0x24, 0xc5, 0x4a, 0xbf, - 0x17, 0x20, 0x17, 0xe6, 0x23, 0x54, 0x81, 0x8c, 0x61, 0x0d, 0x1c, 0x4a, 0x06, 0x74, 0x5e, 0x1e, - 0x82, 0x13, 0x31, 0x61, 0xa9, 0xa1, 0x61, 0xa9, 0xf4, 0x7d, 0x34, 0x12, 0xa6, 0xe2, 0xd0, 0xb0, - 0x9e, 0x11, 0x29, 0x55, 0xd1, 0x4e, 0x98, 0x4a, 0x3c, 0xa2, 0xa2, 0x9d, 0xf8, 0x2a, 0x25, 0x7a, - 0xf1, 0x3b, 0x1e, 0xad, 0xcc, 0xe3, 0xa1, 0xab, 0xdc, 0xf1, 0xd0, 0x12, 0xa4, 0x8f, 0x0d, 0xc7, - 0x1b, 0x6b, 0x26, 0x2d, 0xc2, 0x79, 0xdf, 0xc3, 0x85, 0xa5, 0x23, 0xc8, 0x86, 0x78, 0x6c, 0x8e, - 0x03, 0xfd, 0x1e, 0x24, 0x82, 0xa4, 0x9a, 0xb3, 0x26, 0xa7, 0x06, 0xa5, 0x9f, 0x0b, 0x70, 0x73, - 0x1a, 0x93, 0x44, 0x42, 0xc4, 0xf7, 0xd3, 0x5c, 0x21, 0x12, 0x61, 0xf8, 0xd8, 0x54, 0x86, 0x9f, - 0x9c, 0x5c, 0x7c, 0xf6, 0xc9, 0x55, 0x3e, 0xe4, 0xcd, 0x1a, 0x40, 0x6a, 0x7b, 0xb7, 0xde, 0x69, - 0x37, 0xa6, 0x36, 0x5a, 0x28, 0x0f, 0x99, 0xf6, 0xd6, 0x76, 0x4f, 0xe9, 0xb7, 0xbb, 0x8f, 0xa5, - 0x38, 0xe9, 0xd0, 0x02, 0x92, 0x46, 0x39, 0x10, 0x9b, 0xed, 0x9d, 0x5a, 0xbd, 0xd3, 0x6a, 0x4a, - 0x0b, 0x44, 0x53, 0x69, 0xd5, 0x9a, 0xb4, 0xa1, 0x93, 0x84, 0xef, 0x27, 0xbe, 0xf8, 0xd5, 0xb2, - 0xe0, 0x77, 0x66, 0x9b, 0x09, 0x11, 0x49, 0x37, 0x2a, 0x5f, 0x09, 0x80, 0x9a, 0x9a, 0xa7, 0x11, - 0x42, 0xb8, 0x46, 0x8b, 0x16, 0xbb, 0xe2, 0x5c, 0xa2, 0x65, 0x77, 0xfc, 0x55, 0xca, 0x6e, 0x7f, - 0xc1, 0x95, 0x2f, 0x05, 0x80, 0xd0, 0xe2, 0x3e, 0x0e, 0xff, 0xd5, 0x3d, 0xbb, 0xc3, 0xb8, 0x70, - 0x79, 0x6c, 0x2c, 0xf0, 0x3f, 0xc2, 0x1f, 0x83, 0xa8, 0xb3, 0x2d, 0xb3, 0xe0, 0x99, 0x59, 0xca, - 0x5f, 0xf2, 0xcc, 0x06, 0x39, 0x55, 0x26, 0xad, 0xa7, 0x21, 0x39, 0xb6, 0x0c, 0xdb, 0x7a, 0xa7, - 0x19, 0x7e, 0x02, 0xe3, 0x64, 0x4a, 0x9c, 0x4f, 0x7f, 0x6b, 0x1e, 0xd6, 0xfd, 0xa6, 0x7b, 0xd7, - 0x3a, 0x0e, 0x04, 0x02, 0x2a, 0x00, 0xb0, 0x71, 0xc3, 0x3a, 0x94, 0x62, 0xf5, 0x7b, 0x5f, 0xff, - 0x6d, 0x69, 0xe1, 0xeb, 0xf3, 0x25, 0xe1, 0x8f, 0xe7, 0x4b, 0xc2, 0x9f, 0xcf, 0x97, 0x84, 0xbf, - 0x9e, 0x2f, 0x09, 0x3f, 0xfb, 0xfb, 0xd2, 0xc2, 0x8f, 0xd2, 0x6c, 0x41, 0xff, 0x0d, 0x00, 0x00, - 0xff, 0xff, 0xb9, 0x1f, 0xc8, 0x03, 0x80, 0x20, 0x00, 0x00, + proto.RegisterFile("sql/sqlbase/structured.proto", fileDescriptor_structured_a6ff21a8835b349b) +} + +var fileDescriptor_structured_a6ff21a8835b349b = []byte{ + // 2930 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0xcd, 0x6f, 0xe3, 0xc6, + 0x15, 0x37, 0xf5, 0x49, 0x3d, 0x7d, 0xd1, 0xb3, 0x1f, 0xe1, 0x2a, 0x1b, 0x5b, 0xab, 0x64, 0x53, + 0x37, 0x1f, 0xf2, 0xc6, 0xdb, 0xb4, 0xdb, 0xa4, 0x08, 0xaa, 0x2f, 0xaf, 0x65, 0xcb, 0x92, 0x97, + 0x96, 0xd7, 0x49, 0x91, 0x96, 0xa0, 0xc5, 0xb1, 0xcd, 0x2c, 0x45, 0x6a, 0x49, 0xca, 0xb5, 0xff, + 0x83, 0x5c, 0x0a, 0xf4, 0xd4, 0xde, 0x82, 0x22, 0xe8, 0xa1, 0x40, 0xaf, 0x3d, 0xf4, 0x4f, 0xc8, + 0xb1, 0xc7, 0xa0, 0x07, 0xa3, 0x75, 0xd1, 0x6b, 0x8b, 0x5e, 0x17, 0x2d, 0x50, 0xcc, 0x70, 0x86, + 0xa4, 0x6c, 0xd9, 0x95, 0x77, 0x7b, 0x13, 0xdf, 0xbc, 0xf7, 0x9b, 0x99, 0x37, 0xef, 0xfd, 0xe6, + 0xbd, 0x11, 0xdc, 0x75, 0x9f, 0x9b, 0xcb, 0xee, 0x73, 0x73, 0x4f, 0x73, 0xf1, 0xb2, 0xeb, 0x39, + 0xe3, 0x81, 0x37, 0x76, 0xb0, 0x5e, 0x1d, 0x39, 0xb6, 0x67, 0xa3, 0x5b, 0x03, 0x7b, 0xf0, 0xcc, + 0xb1, 0xb5, 0xc1, 0x61, 0xd5, 0x7d, 0x6e, 0x56, 0x99, 0x5e, 0x49, 0x1e, 0x7b, 0x86, 0xb9, 0x7c, + 0x68, 0x0e, 0x96, 0x3d, 0x63, 0x88, 0x5d, 0x4f, 0x1b, 0x8e, 0x7c, 0x83, 0xd2, 0xeb, 0x51, 0xb8, + 0x91, 0x63, 0x1c, 0x19, 0x26, 0x3e, 0xc0, 0x6c, 0xf0, 0xe6, 0x81, 0x7d, 0x60, 0xd3, 0x9f, 0xcb, + 0xe4, 0x97, 0x2f, 0xad, 0xfc, 0x3b, 0x01, 0x37, 0x56, 0x6d, 0x07, 0x1b, 0x07, 0xd6, 0x06, 0x3e, + 0x51, 0xf0, 0x3e, 0x76, 0xb0, 0x35, 0xc0, 0xa8, 0x0c, 0x49, 0x4f, 0xdb, 0x33, 0xb1, 0x2c, 0x94, + 0x85, 0xa5, 0x7c, 0x1d, 0xbe, 0x39, 0x5d, 0x9c, 0x7b, 0x71, 0xba, 0x18, 0x6b, 0x37, 0x15, 0x7f, + 0x00, 0xdd, 0x87, 0xa4, 0x61, 0xe9, 0xf8, 0x58, 0x8e, 0x51, 0x8d, 0x22, 0xd3, 0x48, 0xb7, 0x89, + 0x90, 0xa8, 0xd1, 0x51, 0x24, 0x43, 0xc2, 0xd2, 0x86, 0x58, 0x8e, 0x97, 0x85, 0xa5, 0x4c, 0x3d, + 0x41, 0xb4, 0x14, 0x2a, 0x41, 0x1b, 0x20, 0x1e, 0x69, 0xa6, 0xa1, 0x1b, 0xde, 0x89, 0x9c, 0x28, + 0x0b, 0x4b, 0x85, 0x95, 0xef, 0x56, 0xa7, 0xee, 0xb8, 0xda, 0xb0, 0x2d, 0xd7, 0x73, 0x34, 0xc3, + 0xf2, 0x9e, 0x32, 0x03, 0x06, 0x14, 0x00, 0xa0, 0x07, 0x30, 0xef, 0x1e, 0x6a, 0x0e, 0xd6, 0xd5, + 0x91, 0x83, 0xf7, 0x8d, 0x63, 0xd5, 0xc4, 0x96, 0x9c, 0x2c, 0x0b, 0x4b, 0x49, 0xa6, 0x5a, 0xf4, + 0x87, 0xb7, 0xe8, 0x68, 0x07, 0x5b, 0xa8, 0x0f, 0x19, 0xdb, 0x52, 0x75, 0x6c, 0x62, 0x0f, 0xcb, + 0x29, 0x3a, 0xff, 0x07, 0x97, 0xcc, 0x3f, 0xc5, 0x41, 0xd5, 0xda, 0xc0, 0x33, 0x6c, 0x8b, 0xaf, + 0xc3, 0xb6, 0x9a, 0x14, 0x88, 0xa1, 0x8e, 0x47, 0xba, 0xe6, 0x61, 0x39, 0xfd, 0xca, 0xa8, 0x3b, + 0x14, 0x08, 0x75, 0x20, 0x39, 0xd4, 0xbc, 0xc1, 0xa1, 0x2c, 0x52, 0xc4, 0x07, 0xd7, 0x40, 0xdc, + 0x24, 0x76, 0x0c, 0xd0, 0x07, 0xa9, 0xec, 0x42, 0xca, 0x9f, 0x07, 0xe5, 0x21, 0xd3, 0xed, 0xa9, + 0xb5, 0x46, 0xbf, 0xdd, 0xeb, 0x4a, 0x73, 0x28, 0x07, 0xa2, 0xd2, 0xda, 0xee, 0x2b, 0xed, 0x46, + 0x5f, 0x12, 0xc8, 0xd7, 0x76, 0xab, 0xaf, 0x76, 0x77, 0x3a, 0x1d, 0x29, 0x86, 0x8a, 0x90, 0x25, + 0x5f, 0xcd, 0xd6, 0x6a, 0x6d, 0xa7, 0xd3, 0x97, 0xe2, 0x28, 0x0b, 0xe9, 0x46, 0x6d, 0xbb, 0x51, + 0x6b, 0xb6, 0xa4, 0x44, 0x29, 0xf1, 0xbb, 0xdf, 0x2e, 0xcc, 0x55, 0x1e, 0x40, 0x92, 0x4e, 0x87, + 0x00, 0x52, 0xdb, 0xed, 0xcd, 0xad, 0x4e, 0x4b, 0x9a, 0x43, 0x22, 0x24, 0x56, 0x09, 0x84, 0x40, + 0x2c, 0xb6, 0x6a, 0x4a, 0xbf, 0x5d, 0xeb, 0x48, 0x31, 0x66, 0xf1, 0x8f, 0x18, 0x48, 0x0d, 0xdb, + 0x1c, 0x0f, 0xad, 0x26, 0x76, 0x07, 0x8e, 0x31, 0xf2, 0x6c, 0x27, 0x08, 0x19, 0xe1, 0x42, 0xc8, + 0xbc, 0x0d, 0x31, 0x43, 0x67, 0x01, 0x77, 0x9b, 0xc8, 0xcf, 0x68, 0x48, 0xbe, 0x38, 0x5d, 0x14, + 0x7d, 0x94, 0x76, 0x53, 0x89, 0x19, 0x3a, 0xea, 0x40, 0xc2, 0x3b, 0x19, 0xf9, 0x41, 0x97, 0xab, + 0x3f, 0x22, 0x9a, 0x7f, 0x3e, 0x5d, 0x7c, 0x70, 0x60, 0x78, 0x87, 0xe3, 0xbd, 0xea, 0xc0, 0x1e, + 0x2e, 0x07, 0x0e, 0xd4, 0xf7, 0xc2, 0xdf, 0xcb, 0xa3, 0x67, 0x07, 0x24, 0x7f, 0x96, 0x89, 0xb1, + 0x5b, 0xed, 0x2b, 0x14, 0x05, 0x95, 0x41, 0xb4, 0xc6, 0xa6, 0x49, 0xd3, 0x81, 0x04, 0xaa, 0xc8, + 0xcf, 0x87, 0x4b, 0xd1, 0x3d, 0xc8, 0xe9, 0x78, 0x5f, 0x1b, 0x9b, 0x9e, 0x8a, 0x8f, 0x47, 0x0e, + 0x0d, 0xbc, 0x8c, 0x92, 0x65, 0xb2, 0xd6, 0xf1, 0xc8, 0x41, 0x77, 0x21, 0x75, 0x68, 0xe8, 0x3a, + 0xb6, 0x68, 0xac, 0x71, 0x08, 0x26, 0x43, 0x2b, 0x30, 0x3f, 0x76, 0xb1, 0xab, 0xba, 0xf8, 0xf9, + 0x98, 0x1c, 0x9b, 0x6a, 0xe8, 0xae, 0x0c, 0xe5, 0xf8, 0x52, 0xbe, 0x9e, 0x62, 0x69, 0x57, 0x24, + 0x0a, 0xdb, 0x6c, 0xbc, 0xad, 0xbb, 0x64, 0xd2, 0x81, 0x3d, 0x1c, 0x8d, 0x3d, 0xec, 0x4f, 0x9a, + 0xf5, 0x27, 0x65, 0x32, 0x32, 0xe9, 0x7a, 0x42, 0x14, 0xa5, 0xcc, 0x7a, 0x42, 0xcc, 0x48, 0xb0, + 0x9e, 0x10, 0xd3, 0x92, 0x58, 0xf9, 0x32, 0x06, 0xb7, 0x7d, 0x57, 0xad, 0x6a, 0x43, 0xc3, 0x3c, + 0x79, 0x55, 0xb7, 0xfb, 0x28, 0xcc, 0xed, 0x74, 0x45, 0x04, 0x5b, 0x25, 0x66, 0xae, 0x1c, 0x2f, + 0xc7, 0xfd, 0x15, 0x11, 0x59, 0x97, 0x88, 0xd0, 0x23, 0x00, 0xa6, 0x42, 0x76, 0x98, 0xa0, 0x3b, + 0xbc, 0x73, 0x76, 0xba, 0x98, 0xe1, 0xe7, 0xe7, 0x4e, 0x1c, 0x66, 0xc6, 0x57, 0x26, 0xdb, 0xed, + 0xc1, 0x3c, 0xf7, 0x71, 0x80, 0x40, 0x1d, 0x9d, 0xaf, 0xbf, 0xc9, 0xd6, 0x54, 0x6c, 0xfa, 0x0a, + 0xdc, 0x7c, 0x02, 0xaa, 0xa8, 0x4f, 0x0c, 0xea, 0x95, 0xdf, 0xc7, 0xe0, 0x66, 0xdb, 0xf2, 0xb0, + 0x63, 0x62, 0xed, 0x08, 0x47, 0x1c, 0xf1, 0x29, 0x64, 0x34, 0x6b, 0x80, 0x5d, 0xcf, 0x76, 0x5c, + 0x59, 0x28, 0xc7, 0x97, 0xb2, 0x2b, 0xdf, 0xbb, 0x24, 0xe3, 0xa6, 0xd9, 0x57, 0x6b, 0xcc, 0x98, + 0xf9, 0x30, 0x04, 0x2b, 0xfd, 0x51, 0x00, 0x91, 0x8f, 0xa2, 0x07, 0x20, 0x52, 0x26, 0x25, 0xfb, + 0xf0, 0x59, 0xf6, 0x16, 0xdb, 0x47, 0xba, 0x4f, 0xe4, 0x74, 0xfd, 0xe4, 0xe4, 0xd3, 0x54, 0xad, + 0xad, 0xa3, 0x0f, 0x41, 0xa4, 0xa4, 0xaa, 0x06, 0xa7, 0x51, 0xe2, 0x16, 0x8c, 0x75, 0xa3, 0x04, + 0x9c, 0xa6, 0xba, 0x6d, 0x1d, 0x35, 0xa6, 0x71, 0x63, 0x9c, 0xda, 0xbf, 0xc6, 0x3d, 0xb7, 0x3d, + 0xc9, 0x8e, 0x17, 0xe8, 0xb2, 0xf2, 0xf7, 0x38, 0xdc, 0xde, 0xd2, 0x1c, 0xcf, 0x20, 0xc4, 0x61, + 0x58, 0x07, 0x11, 0x7f, 0xdd, 0x87, 0xac, 0x35, 0x1e, 0xb2, 0x53, 0x71, 0xd9, 0x5e, 0xfc, 0xbd, + 0x83, 0x35, 0x1e, 0xfa, 0x0e, 0x77, 0x49, 0x52, 0x9a, 0x86, 0xeb, 0xc9, 0x31, 0xea, 0xd1, 0x95, + 0x4b, 0x3c, 0x3a, 0x7d, 0x8e, 0x6a, 0xc7, 0x70, 0x3d, 0x1e, 0x93, 0x04, 0x05, 0xf5, 0x20, 0xe9, + 0x68, 0xd6, 0x01, 0xa6, 0x41, 0x96, 0x5d, 0x79, 0x78, 0x3d, 0x38, 0x85, 0x98, 0x72, 0x56, 0xa4, + 0x38, 0xa5, 0x5f, 0x0b, 0x90, 0x20, 0xb3, 0x5c, 0x91, 0x07, 0xb7, 0x21, 0x75, 0xa4, 0x99, 0x63, + 0xec, 0xd2, 0x3d, 0xe4, 0x14, 0xf6, 0x85, 0x7e, 0x0a, 0x45, 0x77, 0xbc, 0x37, 0x8a, 0x4c, 0x45, + 0xdd, 0x9b, 0x5d, 0x79, 0xff, 0x5a, 0xab, 0x0a, 0x6e, 0xaa, 0x49, 0xac, 0xd2, 0x33, 0x48, 0xd2, + 0xf5, 0x5e, 0xb1, 0xb2, 0x7b, 0x90, 0xf3, 0x6c, 0x15, 0x1f, 0x0f, 0xcc, 0xb1, 0x6b, 0x1c, 0x61, + 0x1a, 0x1d, 0x39, 0x25, 0xeb, 0xd9, 0x2d, 0x2e, 0x42, 0xf7, 0xa1, 0xb0, 0xef, 0xd8, 0x43, 0xd5, + 0xb0, 0xb8, 0x12, 0x65, 0x47, 0x25, 0x4f, 0xa4, 0x6d, 0x2e, 0xac, 0xfc, 0x47, 0x84, 0x22, 0x8d, + 0xa0, 0x99, 0x98, 0xe1, 0x7e, 0x84, 0x19, 0x6e, 0x4d, 0x30, 0x43, 0x10, 0x86, 0x84, 0x18, 0xee, + 0x42, 0x6a, 0x6c, 0x19, 0xcf, 0xc7, 0xfe, 0x9c, 0x01, 0xf9, 0xf9, 0xb2, 0x0b, 0xb4, 0x91, 0xb8, + 0x48, 0x1b, 0xef, 0x01, 0x22, 0x39, 0x83, 0xd5, 0x09, 0xc5, 0x24, 0x55, 0x94, 0xe8, 0x48, 0xe3, + 0x52, 0x92, 0x49, 0x5d, 0x83, 0x64, 0xd6, 0x40, 0xc2, 0xc7, 0x9e, 0xa3, 0xa9, 0x11, 0xfb, 0x34, + 0xb5, 0x5f, 0x38, 0x3b, 0x5d, 0x2c, 0xb4, 0xc8, 0xd8, 0x74, 0x90, 0x02, 0x8e, 0x8c, 0xe9, 0x24, + 0x26, 0xe6, 0x19, 0x86, 0x6e, 0x38, 0x98, 0x5e, 0xb7, 0xae, 0x2c, 0x96, 0xe3, 0x57, 0x5c, 0xdf, + 0xe7, 0xdc, 0x5e, 0x6d, 0x72, 0x43, 0x45, 0xf2, 0xa1, 0x02, 0x81, 0x8b, 0x9e, 0x40, 0x76, 0xdf, + 0xbf, 0xed, 0xd5, 0x67, 0xf8, 0x44, 0xce, 0xd0, 0x70, 0x7b, 0x67, 0xf6, 0xba, 0x80, 0xe7, 0xe7, + 0x7e, 0x30, 0x84, 0x76, 0x20, 0xef, 0xf0, 0x61, 0x5d, 0xdd, 0x3b, 0xa1, 0xf7, 0xcf, 0xcb, 0x80, + 0xe6, 0x42, 0x98, 0xfa, 0x09, 0x7a, 0x02, 0x60, 0x04, 0x2c, 0x49, 0x2f, 0xa9, 0xec, 0xca, 0xbb, + 0xd7, 0xa0, 0x53, 0xbe, 0xd2, 0x10, 0x04, 0xed, 0x42, 0x21, 0xfc, 0xa2, 0x4b, 0xcd, 0xbd, 0xe4, + 0x52, 0xf3, 0x11, 0x9c, 0xfa, 0x09, 0xea, 0xc3, 0x4d, 0x72, 0x7d, 0xda, 0xae, 0xe1, 0xe1, 0x68, + 0x08, 0xe4, 0x69, 0x08, 0x54, 0xce, 0x4e, 0x17, 0x51, 0x83, 0x8f, 0x4f, 0x0f, 0x03, 0x34, 0x38, + 0x37, 0xee, 0x07, 0xd5, 0x44, 0xf0, 0x12, 0xc4, 0x42, 0x18, 0x54, 0xdb, 0x61, 0xf8, 0x5e, 0x08, + 0xaa, 0x48, 0x68, 0x13, 0xa4, 0x5d, 0xc8, 0x4d, 0xb0, 0x4c, 0xf1, 0xe5, 0x59, 0x66, 0x02, 0x08, + 0xb5, 0x58, 0xc1, 0x24, 0xd1, 0xfa, 0xf2, 0xdd, 0x19, 0x03, 0xb4, 0x7f, 0x32, 0xe2, 0x8e, 0xa4, + 0xe6, 0x95, 0x05, 0xc8, 0x04, 0x31, 0x8a, 0xd2, 0x10, 0xaf, 0x6d, 0x37, 0xfc, 0x0a, 0xb0, 0xd9, + 0xda, 0x6e, 0x48, 0x42, 0xe5, 0x1e, 0x24, 0x88, 0x0d, 0xa9, 0x04, 0x57, 0x7b, 0xca, 0x6e, 0x4d, + 0x69, 0xfa, 0x55, 0x67, 0xbb, 0xfb, 0xb4, 0xa5, 0xf4, 0x5b, 0x4d, 0x49, 0xa8, 0xfc, 0x2b, 0x0e, + 0x28, 0xac, 0xf7, 0xfb, 0x36, 0xab, 0x80, 0x0f, 0xa0, 0x38, 0x08, 0xa4, 0x2a, 0x5d, 0xab, 0x50, + 0x8e, 0x2d, 0x15, 0x56, 0x1e, 0xfd, 0xcf, 0x9e, 0x81, 0x63, 0x44, 0x45, 0xe1, 0xc2, 0x0b, 0x83, + 0x09, 0x69, 0xc0, 0x75, 0xb1, 0x72, 0xec, 0x1c, 0xd7, 0x29, 0x90, 0x1c, 0x1c, 0xe2, 0xc1, 0x33, + 0xc6, 0xed, 0xdf, 0xbf, 0x64, 0x62, 0x7a, 0x77, 0x47, 0x9c, 0xd4, 0x20, 0x36, 0xe1, 0xd4, 0xfc, + 0xd2, 0xa1, 0x50, 0xe7, 0xd3, 0x38, 0xf1, 0x7f, 0x48, 0xe3, 0x8f, 0x61, 0x3e, 0x02, 0xa9, 0xfa, + 0x3d, 0x5a, 0x72, 0x7a, 0x8f, 0x56, 0x0c, 0xed, 0xa8, 0x08, 0x3d, 0x82, 0xa2, 0x65, 0x7b, 0x2a, + 0x29, 0x6c, 0x59, 0xb4, 0xd2, 0x72, 0x35, 0x5f, 0x97, 0x98, 0x69, 0x18, 0x9b, 0x79, 0xcb, 0xf6, + 0xba, 0x63, 0xd3, 0xf4, 0x05, 0x95, 0x8f, 0xa0, 0x30, 0xe9, 0x5f, 0x94, 0x81, 0x64, 0x63, 0xad, + 0xd5, 0xd8, 0x90, 0xe6, 0x48, 0xf3, 0xb0, 0xda, 0x53, 0x5a, 0xed, 0xc7, 0x5d, 0x75, 0xa3, 0xf5, + 0x99, 0xdf, 0x5b, 0x74, 0x7b, 0xbc, 0xb7, 0xa8, 0xfc, 0x33, 0x01, 0x28, 0xf4, 0xd8, 0xe6, 0xd8, + 0xd3, 0x68, 0x00, 0xd5, 0x20, 0xc5, 0xd6, 0x20, 0x50, 0xbf, 0x7c, 0xe7, 0xd2, 0xa3, 0x9e, 0x6c, + 0x20, 0xd6, 0xe6, 0x14, 0x66, 0x88, 0x3e, 0x89, 0x36, 0xa9, 0xd9, 0x95, 0xb7, 0x67, 0x0b, 0xec, + 0xb5, 0x39, 0xde, 0xbd, 0x6e, 0x40, 0xd2, 0xf5, 0x48, 0x2b, 0x17, 0xa7, 0x89, 0xb1, 0x7c, 0x89, + 0xfd, 0xc5, 0xc5, 0x57, 0xb7, 0x89, 0x19, 0x3f, 0x6c, 0x8a, 0x81, 0x76, 0x21, 0x13, 0xdc, 0x05, + 0xac, 0xe3, 0x7d, 0x38, 0x3b, 0x60, 0x90, 0x58, 0xbc, 0xac, 0x0c, 0xb0, 0x50, 0x0d, 0xb2, 0x43, + 0xa6, 0x16, 0x16, 0xc5, 0x65, 0x76, 0x1d, 0x03, 0x47, 0xa0, 0xd7, 0x72, 0xe4, 0x4b, 0x01, 0x6e, + 0xd4, 0xd6, 0x49, 0x8f, 0xe3, 0xd8, 0xa6, 0xb9, 0xa7, 0x0d, 0x9e, 0xd1, 0xb6, 0x35, 0xe8, 0x71, + 0xb8, 0x14, 0x6d, 0x90, 0x4b, 0x95, 0x1f, 0x30, 0x6d, 0x44, 0xb3, 0x33, 0x34, 0xec, 0x3c, 0xf9, + 0xd6, 0xe6, 0x94, 0x88, 0x79, 0xe5, 0xc7, 0x90, 0xa4, 0x0e, 0x22, 0x4c, 0xb0, 0xd3, 0xdd, 0xe8, + 0xf6, 0x76, 0xbb, 0x7e, 0x98, 0x34, 0x5b, 0x9d, 0x56, 0xbf, 0xa5, 0xf6, 0xba, 0x1d, 0x12, 0x26, + 0x77, 0xe0, 0x16, 0x13, 0xd4, 0xba, 0x4d, 0x75, 0x57, 0x69, 0xf3, 0xa1, 0x58, 0x65, 0x29, 0x4a, + 0x35, 0x22, 0x24, 0xba, 0xbd, 0x2e, 0xe9, 0x36, 0x09, 0xe9, 0x34, 0x9b, 0x92, 0x40, 0x49, 0x47, + 0xe9, 0x6d, 0x49, 0xb1, 0x7a, 0x0e, 0x40, 0x0f, 0xdc, 0xb9, 0x9e, 0x10, 0x53, 0x52, 0xba, 0xf2, + 0xed, 0xeb, 0x50, 0x3c, 0x97, 0xa8, 0x57, 0x54, 0x39, 0x65, 0x5a, 0xe5, 0xc4, 0xc3, 0x44, 0x08, + 0xaa, 0x9c, 0x18, 0x2b, 0x70, 0x1e, 0x42, 0x66, 0xa4, 0x39, 0xd8, 0xf2, 0x88, 0xff, 0x13, 0x13, + 0x8d, 0x92, 0xb8, 0x45, 0x07, 0x02, 0x75, 0xd1, 0x57, 0x6c, 0x13, 0xa3, 0xf4, 0x11, 0x76, 0x5c, + 0x12, 0x0d, 0xfe, 0x91, 0xdd, 0x61, 0x49, 0x36, 0x1f, 0xae, 0xea, 0xa9, 0xaf, 0xa0, 0x70, 0x4d, + 0xb4, 0x05, 0xf3, 0x43, 0x5b, 0x37, 0xf6, 0x8d, 0x81, 0x7f, 0xde, 0x9e, 0x31, 0xf4, 0x1f, 0x1a, + 0xb2, 0x2b, 0x6f, 0x44, 0x4e, 0x63, 0xec, 0x19, 0x66, 0xf5, 0xd0, 0x1c, 0x54, 0xfb, 0xfc, 0x8d, + 0x88, 0xed, 0x48, 0x8a, 0x5a, 0x93, 0x41, 0xf4, 0x18, 0xd2, 0xbc, 0x74, 0x17, 0xe9, 0x35, 0x3a, + 0x6b, 0x9e, 0x31, 0x44, 0x6e, 0x8d, 0x56, 0xa1, 0x60, 0xe1, 0xe3, 0x68, 0x7b, 0x96, 0x99, 0x88, + 0xc4, 0x5c, 0x17, 0x1f, 0x4f, 0xef, 0xcd, 0x72, 0x56, 0x38, 0xa2, 0xa3, 0x27, 0x90, 0x1f, 0x39, + 0xc6, 0x50, 0x73, 0x38, 0x7b, 0xc1, 0x75, 0x92, 0x37, 0xb8, 0xdf, 0x7c, 0x08, 0x9f, 0xd7, 0x56, + 0xc1, 0xef, 0x86, 0xb0, 0x2b, 0x67, 0xe9, 0x1e, 0xaf, 0x07, 0xc6, 0x8d, 0x51, 0x1d, 0xf2, 0x74, + 0x8b, 0x41, 0x1b, 0x96, 0xa3, 0x3b, 0x5c, 0x60, 0x3b, 0xcc, 0x92, 0x1d, 0x4e, 0x69, 0xc5, 0xb2, + 0x56, 0x20, 0xd7, 0xd1, 0x3a, 0x40, 0xf0, 0x36, 0x47, 0x4a, 0x8b, 0xab, 0x28, 0x7f, 0x8b, 0x2b, + 0x86, 0x4b, 0x52, 0x22, 0xd6, 0x68, 0x13, 0x32, 0x3c, 0x89, 0xfd, 0x9a, 0xe2, 0xf2, 0x9c, 0xbc, + 0x48, 0x29, 0x9c, 0x48, 0x02, 0x04, 0xd4, 0x85, 0xa4, 0x89, 0x35, 0x17, 0xb3, 0xc2, 0xe2, 0xd1, + 0x8c, 0x57, 0xdc, 0xf6, 0xe0, 0x10, 0x0f, 0xb5, 0xc6, 0x21, 0x69, 0x52, 0x3a, 0xc4, 0x5e, 0xf1, + 0x61, 0x50, 0x17, 0x24, 0xea, 0xae, 0x28, 0x3b, 0x49, 0xd4, 0x63, 0x6f, 0x31, 0x8f, 0x15, 0x88, + 0xc7, 0x2e, 0x65, 0x28, 0x1a, 0x4f, 0x9b, 0x21, 0x4b, 0xfd, 0x08, 0x0a, 0xfb, 0xb6, 0x33, 0xd4, + 0x3c, 0x95, 0x27, 0xce, 0x7c, 0xd8, 0x7a, 0xbc, 0x38, 0x5d, 0xcc, 0xaf, 0xd2, 0x51, 0x9e, 0x34, + 0xf9, 0xfd, 0xe8, 0x27, 0x5a, 0xe3, 0x64, 0x7e, 0x83, 0x72, 0xef, 0x7b, 0xb3, 0xee, 0xee, 0x22, + 0x93, 0x77, 0x21, 0x45, 0xef, 0x6f, 0x57, 0xbe, 0x49, 0x7d, 0xfe, 0x92, 0xb5, 0x80, 0xc2, 0x50, + 0xd0, 0xe7, 0x50, 0xd0, 0x89, 0xc4, 0xb0, 0x0e, 0x58, 0x6b, 0x73, 0x8b, 0xe2, 0x2e, 0xcf, 0x88, + 0x4b, 0xda, 0x9e, 0xb6, 0xb5, 0x6f, 0xf3, 0xaa, 0x96, 0x83, 0xf9, 0xed, 0x50, 0x0f, 0xc4, 0x7d, + 0x6d, 0x68, 0x98, 0x06, 0x76, 0xe5, 0xdb, 0x14, 0xf7, 0xfd, 0x2b, 0x33, 0xfc, 0xfc, 0xcb, 0x10, + 0xbf, 0x0a, 0x38, 0x48, 0x90, 0xe8, 0x54, 0x70, 0x42, 0x0e, 0xf5, 0xb5, 0x8b, 0x89, 0xce, 0x5f, + 0x86, 0x26, 0x5e, 0x89, 0x68, 0xa2, 0xb3, 0x2f, 0x1d, 0xbd, 0x09, 0x70, 0x64, 0xe0, 0x9f, 0xab, + 0xcf, 0xc7, 0xd8, 0x39, 0x91, 0xe5, 0x08, 0xef, 0x66, 0x88, 0xfc, 0x09, 0x11, 0xa3, 0x0f, 0x20, + 0xa3, 0xe3, 0x11, 0xb6, 0x74, 0xb7, 0x67, 0xc9, 0x77, 0x68, 0xd9, 0x7c, 0x83, 0xf4, 0x72, 0x4d, + 0x2e, 0x64, 0xbc, 0x1a, 0x6a, 0xa1, 0x2f, 0x20, 0xe7, 0x7f, 0x60, 0xbd, 0x67, 0xd5, 0x4f, 0xe4, + 0x12, 0xdd, 0xf4, 0x83, 0x19, 0x9d, 0x19, 0x16, 0x57, 0x37, 0xf9, 0x7e, 0x9a, 0x11, 0x34, 0x65, + 0x02, 0x1b, 0x7d, 0x0e, 0x39, 0x1e, 0xdd, 0xeb, 0xf6, 0x9e, 0x2b, 0xbf, 0x7e, 0xe5, 0xeb, 0xc6, + 0xf9, 0xb9, 0x36, 0x43, 0x53, 0xce, 0x5b, 0x51, 0x34, 0xf4, 0x29, 0xe4, 0x83, 0x27, 0x41, 0x7b, + 0xe4, 0xb9, 0xf2, 0x5d, 0x9a, 0x98, 0x0f, 0x67, 0x0d, 0x5d, 0x66, 0xdb, 0x1b, 0x79, 0xae, 0x92, + 0x73, 0x23, 0x5f, 0xe8, 0x1e, 0x64, 0x74, 0xc7, 0x1e, 0xf9, 0xf7, 0xc7, 0x1b, 0x65, 0x61, 0x29, + 0xce, 0x8f, 0x99, 0x88, 0xe9, 0xc5, 0xa0, 0x42, 0xc1, 0xc1, 0x23, 0x53, 0x1b, 0xe0, 0x21, 0xb9, + 0xd9, 0xec, 0x7d, 0x79, 0x81, 0xce, 0xbe, 0x32, 0xb3, 0x23, 0x03, 0x63, 0x1e, 0x98, 0x11, 0xbc, + 0xde, 0x3e, 0xda, 0x01, 0xd0, 0xc6, 0xba, 0xe1, 0xa9, 0x43, 0x5b, 0xc7, 0xf2, 0xe2, 0x95, 0x6f, + 0xdb, 0xe7, 0xc1, 0x6b, 0xc4, 0x70, 0xd3, 0xd6, 0x71, 0xf0, 0xca, 0xc6, 0x05, 0xe8, 0x03, 0xc8, + 0xd2, 0xad, 0x7d, 0x61, 0xef, 0x91, 0xd8, 0x2c, 0xd3, 0xcd, 0xcd, 0xb3, 0xb3, 0xcc, 0x34, 0x1d, + 0x7b, 0xb4, 0x6e, 0xef, 0xd1, 0x88, 0x61, 0x3f, 0x75, 0xe4, 0x42, 0xee, 0x60, 0xa0, 0x86, 0x54, + 0x7a, 0x8f, 0x9e, 0xe2, 0xc7, 0x33, 0xae, 0xe5, 0x71, 0x63, 0x0a, 0xb9, 0xde, 0xe0, 0x77, 0xc2, + 0xe3, 0x06, 0x97, 0xb9, 0x4a, 0xf6, 0x60, 0x10, 0x7c, 0x94, 0xbe, 0x16, 0x60, 0xfe, 0x02, 0x75, + 0xa2, 0x9f, 0x41, 0xda, 0xb2, 0xf5, 0xc8, 0xab, 0x60, 0x8b, 0x01, 0xa5, 0xba, 0xb6, 0xee, 0x3f, + 0x0a, 0x3e, 0x9c, 0xe9, 0x21, 0x9b, 0xfe, 0x1a, 0xed, 0x55, 0x7d, 0x33, 0x25, 0x45, 0x50, 0xdb, + 0x3a, 0x7a, 0x1f, 0x8a, 0xf8, 0x78, 0x64, 0x38, 0x91, 0xf2, 0x21, 0x16, 0x39, 0xfe, 0x42, 0x38, + 0x48, 0x82, 0xa0, 0xf4, 0x8b, 0x18, 0x14, 0xcf, 0xd1, 0x16, 0xa9, 0x94, 0xe8, 0x8b, 0xf3, 0x44, + 0xa5, 0x44, 0x24, 0x91, 0xee, 0xe9, 0xaa, 0x7f, 0x7b, 0xe2, 0xaf, 0xfa, 0x6f, 0xcf, 0xe4, 0x03, + 0x4f, 0xf2, 0x1a, 0x0f, 0x3c, 0x3f, 0x84, 0xdb, 0x86, 0xab, 0x5a, 0xb6, 0xc5, 0x7b, 0x9c, 0xa0, + 0xa2, 0x8d, 0x3e, 0xcb, 0xdf, 0x30, 0xdc, 0xae, 0x6d, 0xf9, 0xdd, 0x0d, 0x57, 0x58, 0x4f, 0x88, + 0x09, 0x29, 0x59, 0xfa, 0x0c, 0x44, 0xce, 0xb6, 0x93, 0x55, 0x9f, 0x30, 0x63, 0xd5, 0x77, 0xa9, + 0x8b, 0x4a, 0x5f, 0x09, 0x90, 0x89, 0xfe, 0x03, 0x17, 0x0b, 0x50, 0xa7, 0x17, 0x9d, 0x2f, 0xf9, + 0x1c, 0x3c, 0xe9, 0xbc, 0xf8, 0xec, 0xce, 0x2b, 0x1d, 0x41, 0x36, 0x42, 0x58, 0xe7, 0xdb, 0x0e, + 0xe1, 0x25, 0xda, 0x8e, 0xb7, 0x20, 0xc5, 0xb2, 0xd4, 0x8f, 0xc1, 0x3c, 0xb3, 0x4e, 0xfa, 0x19, + 0x9a, 0xfc, 0x82, 0x64, 0x67, 0xe9, 0x0f, 0x02, 0xe4, 0xa2, 0x54, 0x86, 0x2a, 0x90, 0x31, 0xac, + 0x81, 0x43, 0x79, 0x84, 0xce, 0xcb, 0xa3, 0x37, 0x14, 0x13, 0x82, 0x1b, 0x1a, 0x96, 0x4a, 0x9f, + 0x68, 0x27, 0x22, 0x5c, 0x1c, 0x1a, 0xd6, 0x53, 0x22, 0xa5, 0x2a, 0xda, 0x31, 0x53, 0x89, 0x4f, + 0xa8, 0x68, 0xc7, 0xbe, 0x4a, 0x89, 0xd6, 0x0c, 0x8e, 0x47, 0x8b, 0xfa, 0x78, 0xa4, 0x0a, 0x70, + 0x3c, 0xb4, 0x00, 0xe9, 0x23, 0xc3, 0xf1, 0xc6, 0x9a, 0x49, 0xeb, 0x77, 0x1e, 0x3c, 0x5c, 0x58, + 0x3a, 0x84, 0x6c, 0x84, 0x02, 0x67, 0x38, 0xd0, 0x1f, 0x40, 0x22, 0xc8, 0xc7, 0x19, 0xcb, 0x79, + 0x6a, 0x50, 0xfa, 0x95, 0x00, 0x37, 0xa7, 0x91, 0xd0, 0x44, 0x88, 0xf8, 0x7e, 0x9a, 0x29, 0x44, + 0x26, 0x2e, 0x87, 0xd8, 0xd4, 0xcb, 0x21, 0x3c, 0xb9, 0xf8, 0xe5, 0x27, 0x57, 0xf9, 0x90, 0xf7, + 0x79, 0x00, 0xa9, 0xad, 0x9d, 0x7a, 0xa7, 0xdd, 0x98, 0xda, 0xa3, 0xa1, 0x3c, 0x64, 0xda, 0x9b, + 0x5b, 0x3d, 0xa5, 0xdf, 0xee, 0x3e, 0x96, 0xe2, 0xa4, 0xb9, 0x0b, 0xf8, 0x1d, 0xe5, 0x40, 0x6c, + 0xb6, 0xb7, 0x6b, 0xf5, 0x4e, 0xab, 0x29, 0xcd, 0x11, 0x4d, 0xa5, 0x55, 0x6b, 0xd2, 0x5e, 0x50, + 0x12, 0x3e, 0x4a, 0x7c, 0xf9, 0x9b, 0x45, 0xc1, 0x6f, 0xea, 0xd6, 0x13, 0x22, 0x92, 0x6e, 0x54, + 0xbe, 0x16, 0x00, 0x35, 0x35, 0x4f, 0x23, 0x5c, 0x72, 0x8d, 0xee, 0x2e, 0x76, 0xc5, 0xb9, 0x4c, + 0x56, 0xec, 0xf1, 0x57, 0xa9, 0xd8, 0xfd, 0x05, 0x57, 0xbe, 0x12, 0x00, 0x22, 0x8b, 0xfb, 0x24, + 0xfa, 0x6f, 0xfb, 0xe5, 0xcd, 0xc9, 0xb9, 0x7b, 0x67, 0x6d, 0x8e, 0xff, 0x17, 0xff, 0x18, 0x44, + 0x9d, 0x6d, 0x99, 0x05, 0xcf, 0xa5, 0x5d, 0xc0, 0x05, 0xcf, 0xac, 0x91, 0x53, 0x65, 0xd2, 0x7a, + 0x1a, 0x92, 0x63, 0xcb, 0xb0, 0xad, 0x77, 0x9a, 0xd1, 0x57, 0x38, 0xce, 0xc3, 0xc4, 0xf9, 0xf4, + 0xb7, 0xe6, 0x61, 0xdd, 0xef, 0xd7, 0x77, 0xac, 0xa3, 0x40, 0x20, 0xa0, 0x02, 0x00, 0x1b, 0x37, + 0xac, 0x03, 0x29, 0x56, 0xbf, 0xf7, 0xcd, 0x5f, 0x17, 0xe6, 0xbe, 0x39, 0x5b, 0x10, 0xfe, 0x74, + 0xb6, 0x20, 0x7c, 0x7b, 0xb6, 0x20, 0xfc, 0xe5, 0x6c, 0x41, 0xf8, 0xe5, 0xdf, 0x16, 0xe6, 0x7e, + 0x92, 0x66, 0x0b, 0xfa, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2c, 0xce, 0xab, 0x56, 0x03, 0x21, + 0x00, 0x00, } diff --git a/pkg/sql/sqlbase/structured.proto b/pkg/sql/sqlbase/structured.proto index 49a765eafb60..290edd733fc0 100644 --- a/pkg/sql/sqlbase/structured.proto +++ b/pkg/sql/sqlbase/structured.proto @@ -340,12 +340,18 @@ message ConstraintToUpdate { enum ConstraintType { CHECK = 0; FOREIGN_KEY = 1; + // NOT NULL constraints being added are represented by a dummy check + // constraint so that a multi-state schema change, including a bulk + // validation step, can occur. The check field contains the dummy + // constraint. + NOT_NULL = 2; } required ConstraintType constraint_type = 1 [(gogoproto.nullable) = false]; required string name = 2 [(gogoproto.nullable) = false]; optional TableDescriptor.CheckConstraint check = 3 [(gogoproto.nullable) = false]; optional ForeignKeyReference foreign_key = 4 [(gogoproto.nullable) = false]; optional uint32 foreign_key_index = 5 [(gogoproto.nullable) = false, (gogoproto.casttype) = "IndexID"]; + optional uint32 not_null_column = 6 [(gogoproto.nullable) = false, (gogoproto.casttype) = "ColumnID"]; } // A DescriptorMutation represents a column or an index that @@ -521,6 +527,7 @@ message TableDescriptor { // An ordered list of column IDs used by the check constraint. repeated uint32 column_ids = 5 [(gogoproto.customname) = "ColumnIDs", (gogoproto.casttype) = "ColumnID"]; + optional bool is_non_null_constraint = 6 [(gogoproto.nullable) = false]; } repeated CheckConstraint checks = 20;