Skip to content

Commit 5ded6af

Browse files
committed
fix: accept implicit alter column type casts
1 parent ee36220 commit 5ded6af

2 files changed

Lines changed: 24 additions & 11 deletions

File tree

src/lance_scan.cpp

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2800,17 +2800,33 @@ static void ValidateAlterColumnTypeTarget(const LogicalType &type) {
28002800
static bool IsImplicitCastUsingExpression(const ParsedExpression &expr,
28012801
const string &column_name,
28022802
const LogicalType &target_type) {
2803-
auto *cast_expr = dynamic_cast<const CastExpression *>(&expr);
2804-
if (!cast_expr || cast_expr->try_cast ||
2805-
cast_expr->cast_type != target_type) {
2803+
if (expr.GetExpressionClass() != ExpressionClass::CAST) {
28062804
return false;
28072805
}
2808-
auto *col_ref =
2809-
dynamic_cast<const ColumnRefExpression *>(cast_expr->child.get());
2810-
if (!col_ref || col_ref->column_names.size() != 1) {
2806+
auto &cast_expr = expr.Cast<CastExpression>();
2807+
if (cast_expr.try_cast) {
28112808
return false;
28122809
}
2813-
return StringUtil::CIEquals(col_ref->column_names[0], column_name);
2810+
2811+
LogicalType expression_cast_type;
2812+
try {
2813+
expression_cast_type = UnboundType::TryDefaultBind(cast_expr.cast_type);
2814+
} catch (...) {
2815+
return false;
2816+
}
2817+
if (expression_cast_type != target_type) {
2818+
return false;
2819+
}
2820+
if (!cast_expr.child ||
2821+
cast_expr.child->GetExpressionClass() != ExpressionClass::COLUMN_REF) {
2822+
return false;
2823+
}
2824+
auto &col_ref = cast_expr.child->Cast<ColumnRefExpression>();
2825+
if (col_ref.column_names.empty()) {
2826+
return false;
2827+
}
2828+
// Accept qualified references and match the leaf name against target column.
2829+
return StringUtil::CIEquals(col_ref.column_names.back(), column_name);
28142830
}
28152831

28162832
unique_ptr<CatalogEntry>

test/sql/dml_alter_table_schema_evolution.test

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,12 @@ IO Error: Failed to set NOT NULL in Lance dataset:
8989
statement ok
9090
ALTER TABLE ns.main.alter_table_schema_evolution ALTER COLUMN const_col DROP NOT NULL;
9191

92-
statement error
92+
statement ok
9393
ALTER TABLE ns.main.alter_table_schema_evolution ALTER COLUMN age TYPE BIGINT;
94-
----
95-
Not implemented Error: Lance ALTER COLUMN TYPE only supports implicit USING
9694

9795
query TTTIT
9896
SHOW INDEXES ON 'test/.tmp/alter_table_schema_evolution.lance';
9997
----
100-
age_idx <REGEX>:.* age <REGEX>:[0-9]+ <REGEX>:.*
10198

10299
query I
103100
SELECT sum(age) FROM ns.main.alter_table_schema_evolution

0 commit comments

Comments
 (0)