Skip to content

Commit 664648a

Browse files
craig[bot]fqazi
andcommitted
Merge #144047
144047: sql: fix handle index expressions in declarative schema changer r=fqazi a=fqazi Previously, the declarative schema changer did not correctly handle index expressions, and would end up falling back. This happened because when evaluating the expression no type was specified, so the logic would be quietly skipped because of fallback for an add column case. To address this, this patch fixes the logic to resolve the type correctly when adding columns for index expressions. Fixes: #143891 Release note: None Co-authored-by: Faizan Qazi <[email protected]>
2 parents 0e62864 + fb7a7b3 commit 664648a

21 files changed

+1415
-77
lines changed

pkg/ccl/schemachangerccl/backup_base_generated_test.go

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/sql/schemachanger/scbuild/builder_state.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -838,31 +838,37 @@ func (b *builderState) WrapExpression(tableID catid.DescID, expr tree.Expr) *scp
838838
}
839839

840840
// ComputedColumnExpression implements the scbuildstmt.TableHelpers interface.
841-
func (b *builderState) ComputedColumnExpression(tbl *scpb.Table, d *tree.ColumnTableDef) tree.Expr {
841+
func (b *builderState) ComputedColumnExpression(
842+
tbl *scpb.Table, d *tree.ColumnTableDef, exprContext tree.SchemaExprContext,
843+
) (tree.Expr, *types.T) {
842844
_, _, ns := scpb.FindNamespace(b.QueryByID(tbl.TableID))
843845
tn := tree.MakeTableNameFromPrefix(b.NamePrefix(tbl), tree.Name(ns.Name))
844846
b.ensureDescriptor(tbl.TableID)
845847
// TODO(postamar): this doesn't work when referencing newly added columns.
846-
expr, _, err := schemaexpr.ValidateComputedColumnExpression(
848+
expr, typ, err := schemaexpr.ValidateComputedColumnExpression(
847849
b.ctx,
848850
b.descCache[tbl.TableID].desc.(catalog.TableDescriptor),
849851
d,
850852
&tn,
851-
tree.ComputedColumnExprContext(d.IsVirtual()),
853+
exprContext,
852854
b.semaCtx,
853855
b.clusterSettings.Version.ActiveVersion(b.ctx),
854856
)
855857
if err != nil {
856858
// This may be referencing newly added columns, so cheat and return
857859
// a not implemented error.
858-
panic(errors.Wrapf(errors.WithSecondaryError(scerrors.NotImplementedError(d), err),
859-
"computed column validation error"))
860+
if pgerror.GetPGCode(err) == pgcode.UndefinedColumn {
861+
862+
panic(errors.Wrapf(errors.WithSecondaryError(scerrors.NotImplementedError(d), err),
863+
"computed column validation error"))
864+
}
865+
panic(err)
860866
}
861867
parsedExpr, err := parser.ParseExpr(expr)
862868
if err != nil {
863869
panic(err)
864870
}
865-
return parsedExpr
871+
return parsedExpr, typ
866872
}
867873

868874
// PartialIndexPredicateExpression implements the scbuildstmt.TableHelpers interface.

pkg/sql/schemachanger/scbuild/internal/scbuildstmt/alter_table_add_column.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ func alterTableAddColumn(
173173
))
174174
}
175175
if desc.IsComputed() {
176-
expr := b.WrapExpression(tbl.TableID, b.ComputedColumnExpression(tbl, d))
176+
validExpr, _ := b.ComputedColumnExpression(tbl, d, tree.ComputedColumnExprContext(d.IsVirtual()))
177+
expr := b.WrapExpression(tbl.TableID, validExpr)
177178
if spec.colType.ElementCreationMetadata.In_24_3OrLater {
178179
spec.compute = &scpb.ColumnComputeExpression{
179180
TableID: tbl.TableID,

pkg/sql/schemachanger/scbuild/internal/scbuildstmt/create_index.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -860,20 +860,17 @@ func maybeCreateVirtualColumnForIndex(
860860
// TODO(postamar): call addColumn instead of building AST.
861861
d := &tree.ColumnTableDef{
862862
Name: tree.Name(colName),
863+
Type: types.AnyElement,
863864
}
864865
d.Computed.Computed = true
865866
d.Computed.Virtual = true
866867
d.Computed.Expr = expr
867868
d.Nullable.Nullability = tree.Null
868869
// Infer column type from expression.
869870
{
870-
replacedExpr := b.ComputedColumnExpression(tbl, d)
871-
typedExpr, err := tree.TypeCheck(b, replacedExpr, b.SemaCtx(), types.AnyElement)
872-
if err != nil {
873-
panic(err)
874-
}
875-
d.Type = typedExpr.ResolvedType()
876-
validateColumnIndexableType(typedExpr.ResolvedType())
871+
_, columnType := b.ComputedColumnExpression(tbl, d, tree.ExpressionIndexElementExpr)
872+
d.Type = columnType
873+
validateColumnIndexableType(columnType)
877874
}
878875
alterTableAddColumn(b, tn, tbl, stmt, &tree.AlterTableAddColumn{ColumnDef: d})
879876
// When a virtual column for an index expression gets added for CREATE INDEX

pkg/sql/schemachanger/scbuild/internal/scbuildstmt/dependencies.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/cockroachdb/cockroach/pkg/sql/sem/tree"
2626
"github.com/cockroachdb/cockroach/pkg/sql/sessiondata"
2727
"github.com/cockroachdb/cockroach/pkg/sql/sqltelemetry"
28+
"github.com/cockroachdb/cockroach/pkg/sql/types"
2829
"github.com/cockroachdb/cockroach/pkg/util/log/logpb"
2930
)
3031

@@ -312,7 +313,7 @@ type TableHelpers interface {
312313
// ComputedColumnExpression returns a validated computed column expression
313314
// and its type.
314315
// TODO(postamar): make this more low-level instead of consuming an AST
315-
ComputedColumnExpression(tbl *scpb.Table, d *tree.ColumnTableDef) tree.Expr
316+
ComputedColumnExpression(tbl *scpb.Table, d *tree.ColumnTableDef, exprContext tree.SchemaExprContext) (tree.Expr, *types.T)
316317

317318
// PartialIndexPredicateExpression returns a validated partial predicate
318319
// wrapped expression

pkg/sql/schemachanger/scbuild/testdata/drop_index

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,10 @@ DROP INDEX idx3 CASCADE
9797
{indexId: 6, name: idx3, tableId: 104}
9898
- [[IndexData:{DescID: 104, IndexID: 6}, ABSENT], PUBLIC]
9999
{indexId: 6, tableId: 104}
100-
- [[CheckConstraint:{DescID: 104, IndexID: 0, ConstraintID: 2, ReferencedColumnIDs: [5]}, ABSENT], PUBLIC]
101-
{columnIds: [5], constraintId: 2, expr: 'crdb_internal_i_shard_16 IN (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)', fromHashShardedColumn: true, referencedColumnIds: [5], tableId: 104}
102-
- [[ConstraintWithoutIndexName:{DescID: 104, Name: check_crdb_internal_i_shard_16, ConstraintID: 2}, ABSENT], PUBLIC]
103-
{constraintId: 2, name: check_crdb_internal_i_shard_16, tableId: 104}
100+
- [[CheckConstraint:{DescID: 104, IndexID: 0, ConstraintID: 3, ReferencedColumnIDs: [5]}, ABSENT], PUBLIC]
101+
{columnIds: [5], constraintId: 3, expr: 'crdb_internal_i_shard_16 IN (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)', fromHashShardedColumn: true, referencedColumnIds: [5], tableId: 104}
102+
- [[ConstraintWithoutIndexName:{DescID: 104, Name: check_crdb_internal_i_shard_16, ConstraintID: 3}, ABSENT], PUBLIC]
103+
{constraintId: 3, name: check_crdb_internal_i_shard_16, tableId: 104}
104104
- [[TableData:{DescID: 104, ReferencedDescID: 100}, PUBLIC], PUBLIC]
105105
{databaseId: 100, tableId: 104}
106106
- [[Namespace:{DescID: 105, Name: v, ReferencedDescID: 100}, ABSENT], PUBLIC]

0 commit comments

Comments
 (0)