Skip to content

Commit

Permalink
sql: validate computed columns with
Browse files Browse the repository at this point in the history
default values while adding

Computed columns with default
values are not validated while adding them, this was causing
issues when data is inserted. Same validation mechanism as insert line
is implemented.

Resolves: cockroachdb#81698

Release Note: Previously while adding computed columns with constants
they were not validated, validation is implemented.
Signed-off-by: Kivanc Bilen <kivanc_bilen@hotmail.com>
  • Loading branch information
kivancbilen committed Jan 10, 2023
1 parent 15bc0c4 commit 66c3121
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 2 deletions.
22 changes: 22 additions & 0 deletions pkg/sql/catalog/schemaexpr/computed_column.go
Expand Up @@ -146,6 +146,28 @@ func ValidateComputedColumnExpression(
}
}

// run the same validation in sql/row/row_converter.go => GenerateInsertRow function
var txCtx transform.ExprTransformContext
evalCtx := &eval.Context{}
// compute expression can have dependency to another column,
// in this case line below will throw an error and validation is not necessary
typedExpr, err := tree.TypeCheck(ctx, d.Computed.Expr, semaCtx, defType)
if err == nil {
typedExpr, err = txCtx.NormalizeExpr(ctx, evalCtx, typedExpr)
if err != nil {
return "", nil, err
}
datum, err := eval.Expr(ctx, evalCtx, typedExpr)
if err != nil {
return "", nil, err
}
// AdjustValueToType function does the validation
_, err = tree.AdjustValueToType(defType, datum)
if err != nil {
return "", nil, err
}
}

return expr, typ, nil
}

Expand Down
81 changes: 81 additions & 0 deletions pkg/sql/logictest/testdata/logic_test/computed
Expand Up @@ -1095,3 +1095,84 @@ FROM t88128
----
b1 expected_b1 b2 expected_b2
true true true true

# Regression tests for #81698 computed columns are not validated on existing data"
subtest regression_81698

statement ok
CREATE TABLE t81698 (i INT PRIMARY KEY);

statement ok
CREATE TYPE greeting AS ENUM ('hello', 'howdy', 'hi');

statement ok
ALTER TABLE t81698 ADD COLUMN s VARCHAR(2) AS ('st') STORED;

statement ok
ALTER TABLE t81698 ADD COLUMN test INT;

statement ok
ALTER TABLE t81698 ADD COLUMN ii INT AS (test*2) STORED;

statement ok
ALTER TABLE t81698 ADD COLUMN iii INT AS (test*3) VIRTUAL;

statement error pgcode 22001 pq: value too long for type VARCHAR\(2\)
ALTER TABLE t81698 ADD COLUMN v2 VARCHAR(2) AS ('virtual') VIRTUAL;

statement error pgcode 22001 pq: value too long for type VARCHAR\(2\)
ALTER TABLE t81698 ADD COLUMN v2 VARCHAR(2) AS ('stored') STORED;

statement error pgcode 22003 pq: integer out of range for type int2
ALTER TABLE t81698 ADD COLUMN s3 INT2 AS (32768) STORED;

# should this error be categorized?
statement error pgcode XXUUU pq: expected computed column expression to have type bool, but '32768' has type int
ALTER TABLE t81698 ADD COLUMN s4 BOOL AS (32768) STORED;

statement error pgcode 22003 pq: integer out of range for type int2
ALTER TABLE t81698 ADD COLUMN s3 INT2 AS (32768) VIRTUAL;

# should this error be categorized?
statement error pgcode XXUUU pq: expected computed column expression to have type bool, but '32768' has type int
ALTER TABLE t81698 ADD COLUMN s4 BOOL AS (32768) VIRTUAL;

statement ok
ALTER TABLE t81698 ADD COLUMN w greeting AS ('hi') STORED;

statement error pgcode 22P02 pq: invalid input value for enum greeting: "none"
ALTER TABLE t81698 ADD COLUMN w2 greeting AS ('none') STORED;

statement ok
INSERT INTO t81698 VALUES (2);

statement ok
DROP TABLE t81698;

statement error pgcode 22001 pq: value too long for type VARCHAR\(2\)
CREATE TABLE t81698 (i INT PRIMARY KEY,
v VARCHAR(2) AS ('virtual') VIRTUAL);

statement error pgcode 22001 pq: value too long for type VARCHAR\(2\)
CREATE TABLE t81698 (i INT PRIMARY KEY,
v VARCHAR(2) AS ('stored') STORED);

statement error pgcode 22003 pq: integer out of range for type int2
CREATE TABLE t81698 (i INT PRIMARY KEY,
s3 INT2 AS (32768) STORED);

statement error pgcode 22003 pq: integer out of range for type int2
CREATE TABLE t81698 (i INT PRIMARY KEY,
s3 INT2 AS (32768) VIRTUAL);

statement error pgcode XXUUU pq: expected computed column expression to have type bool, but '32768' has type int
CREATE TABLE t81698 (i INT PRIMARY KEY,
s4 BOOL AS (32768) STORED);

statement error pgcode XXUUU pq: expected computed column expression to have type bool, but '32768' has type int
CREATE TABLE t81698 (i INT PRIMARY KEY,
s4 BOOL AS (32768) VIRTUAL);

statement error pgcode 22P02 pq: invalid input value for enum greeting: "none"
CREATE TABLE t81698 (i INT PRIMARY KEY,
w2 greeting AS ('none') STORED);
3 changes: 1 addition & 2 deletions pkg/sql/logictest/testdata/logic_test/virtual_columns
Expand Up @@ -1313,7 +1313,7 @@ ALTER TABLE t_added ADD COLUMN dn DECIMAL(5, 2) GENERATED ALWAYS AS (NULL) VIRTU

# Note that we really should not be able to add this column as the expression
# does not fit into the type. See #81698.
statement ok
statement error pgcode 22003 pq: type DECIMAL\(5,2\)\: value with precision 5, scale 2 must round to an absolute value less than 10\^3
ALTER TABLE t_added ADD COLUMN d DECIMAL(5, 2) GENERATED ALWAYS AS (123456.000000::DECIMAL) VIRTUAL;

statement ok
Expand Down Expand Up @@ -1342,7 +1342,6 @@ CREATE TABLE public.t_added (
i INT8 NOT NULL,
i4n INT4 NULL AS (NULL) VIRTUAL,
dn DECIMAL(5,2) NULL AS (NULL) VIRTUAL,
d DECIMAL(5,2) NULL AS (123456.000000:::DECIMAL) VIRTUAL,
i4 INT4 NULL AS (4:::INT8) VIRTUAL,
i2 INT2 NULL AS (2:::INT8) VIRTUAL,
CONSTRAINT t_added_pkey PRIMARY KEY (i ASC)
Expand Down
Expand Up @@ -207,12 +207,14 @@ func alterTableAddColumn(
}
if desc.HasDefault() {
expression := b.WrapExpression(tbl.TableID, cdd.DefaultExpr)

spec.def = &scpb.ColumnDefaultExpression{
TableID: tbl.TableID,
ColumnID: spec.col.ColumnID,
Expression: *expression,
}
b.IncrementSchemaChangeAddColumnQualificationCounter("default_expr")

}
// We're checking to see if a user is trying add a non-nullable column without a default to a
// non-empty table by scanning the primary index span with a limit of 1 to see if any key exists.
Expand Down Expand Up @@ -256,6 +258,7 @@ func alterTableAddColumn(
default:
b.IncrementSchemaChangeAddColumnTypeCounter(spec.colType.Type.TelemetryName())
}

}

func columnNamesToIDs(b BuildCtx, tbl *scpb.Table) map[string]descpb.ColumnID {
Expand Down

0 comments on commit 66c3121

Please sign in to comment.