[ 
https://issues.apache.org/jira/browse/IMPALA-15617?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Arnab Karmakar resolved IMPALA-15617.
-------------------------------------
    Fix Version/s: Impala 5.0.0
       Resolution: Fixed

> ALTER COLUMN ... DROP DEFAULT fails on TIMESTAMP columns (Kudu, Iceberg) and 
> BINARY columns (Iceberg)
> -----------------------------------------------------------------------------------------------------
>
>                 Key: IMPALA-15617
>                 URL: https://issues.apache.org/jira/browse/IMPALA-15617
>             Project: IMPALA
>          Issue Type: Bug
>          Components: Frontend
>            Reporter: Zoltán Borók-Nagy
>            Assignee: Arnab Karmakar
>            Priority: Major
>              Labels: impala-iceberg
>             Fix For: Impala 5.0.0
>
>
> ALTER TABLE ... ALTER COLUMN ... DROP DEFAULT fails during analysis on 
> TIMESTAMP columns of Kudu and Iceberg V3 tables, and on BINARY columns of 
> Iceberg V3 tables. It fails whether or not the column has a default, so these 
> defaults cannot be removed from Impala.
> Repro on master:
> {code:sql}
> create table k (id bigint primary key, ts timestamp default now()) stored as 
> kudu;
> alter table k alter column ts drop default;
> {code}
> {noformat}
> AnalysisException: NULL cannot be cast to a TIMESTAMP literal.
> CAUSED BY: InternalException: Error converting timestamp expression: 
> NullLiteral{}
> {noformat}
> {code:sql}
> create table t (i int, ts timestamp, b binary, s string)
>   stored by iceberg tblproperties('format-version'='3');
> alter table t alter column ts drop default;
> alter table t alter column b drop default;
> alter table t alter column s drop default;
> {code}
> {noformat}
> AnalysisException: NULL cannot be cast to a TIMESTAMP literal.
> CAUSED BY: InternalException: Error converting timestamp expression: 
> NullLiteral{}
> AnalysisException: Default values are not supported for type: BINARY
> Column has been altered.
> {noformat}
> For Kudu, the only way to drop a TIMESTAMP default from Impala is to recreate 
> the table. {{ALTER COLUMN ts SET DEFAULT NULL}} and {{CREATE TABLE ... (ts 
> TIMESTAMP DEFAULT NULL)}} fail with the same error.
> For Iceberg, Impala cannot define TIMESTAMP or BINARY defaults, but other 
> engines can. An INSERT that omits such a column fails 
> (IcebergUtil.resolveWriteDefault()). The user has to specify the value in 
> every INSERT, because Impala cannot drop the write default.
> *Analysis*
> AlterTableAlterColStmt.createDropDefaultStmt() represents DROP DEFAULT as a 
> ColumnDef with {{DEFAULT NullLiteral}}, so ColumnDef.analyze() analyzes NULL 
> as a default value:
> * For TIMESTAMP columns, ColumnDef.analyzeKuduOptions() converts the default 
> to Unix time micros with ExprUtil.utcTimestampToUnixTimeMicros() and fails 
> for NULL. This conversion came with IMPALA-5338. The Kudu tests 
> (kudu_create.test tbl_with_null_defaults, kudu_alter.test DROP DEFAULT) do 
> not cover TIMESTAMP columns.
> * For Iceberg tables, AlterTableAlterColStmt.analyze() calls 
> IcebergSchemaConverter.validateIcebergDdlDefaultType() whenever 
> newColDef_.hasDefaultValue() is true, including for DROP DEFAULT. That method 
> rejects TIMESTAMP, BINARY and complex types (IMPALA-14589).
> *Suggested fix*
> * ColumnDef: skip the TIMESTAMP conversion for a NULL default, so that 
> DEFAULT NULL works on nullable TIMESTAMP columns as on other types.
> * AlterTableAlterColStmt: call validateIcebergDdlDefaultType() only for SET 
> DEFAULT, not for DROP DEFAULT.
> * Add tests for DROP DEFAULT and SET DEFAULT NULL on Kudu TIMESTAMP columns, 
> and for DROP DEFAULT on Iceberg TIMESTAMP and BINARY columns whose write 
> default was set outside Impala.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to