Hi, Jingsong.

Thanks for your feedback!

> Can we define classes at once so that the connector can be fully
implemented, but we will not pass changes of the nested column.

It's hard to achieve this. If a new need comes, we will add a new kind of
TableChange. But I think the current proposal aligns with the Flink syntax.

> In addition, can we define the modified class of the nested column as the
parent class? The top-level column modification is just a special case of a
subclass.

I think the modification of the composite type is much more complicated. It
also modifies the MAP, ARRAY type. For example, Spark supports to modify
the element of ARRAY type with the following syntax:


```
-- add a field to the struct within an array. Using keyword 'element' to
access the array's element column.
ALTER TABLE prod.db.sample
ADD COLUMN points.element.z double
```

For the traditional database, they use the ALTER TYPE syntax to modify the
composite type.

```
CREATE TYPE compfoo AS (f1 int, f2 text);

-- add column
ALTER TYPE compfoo ADD ATTRIBUTE f3 int;
-- rename column
ALTER TYPE compfoo RENAME ATTRIBUTE f3 TO f4;
-- drop column
ALTER TYPE compfoo DROP ATTRIBUTE f4;
-- modify type
ALTER TYPE compfoo ALTER ATTRIBUTE f1 TYPE text;

```

I think the modification of the top-level column is different from the
modification of the nested field, and we don't need to introduce a base
class. BTW, the RexFieldAccess is also not the parent class of the
RexInputRef in Calcite.

> ModifyColumn VS fine-grained Change

The syntax in Flink also supports modifying the physical column to a
metadata column, metadata column definition, etc. The main problem here is
we need to expose what kind of changes happen when modifying the metadata
column, modifying the computed column, and changing the column kind. With
these possibilities, it may include:

base: ModifyColumnComment, MoidfyColumnPosition;
physical column: ModifyPhysicalColumnDataType,
ModifyPhysicalColumnNullability;
metadata column: ModifyMetadataColumnMetadataKey,
ModifyMetadataColumnVirtual, ModifyMetdataColumnDataType;
computed column: ModifyComputedColumnExpression
column type change: ModifyPhysicalColumnToMetadataColumn,
ModifyPhysicalColumnToComputedColumn, ModifyComputedColumnToPhysicalColumn,
ModifyComputedColumnToMetadataColumn,
ModifyMetadataColumnToPhysicalColumn, ModifyMetadataColumnToComputedColumn.

I just wonder whether it's better we still keep the ModifyColumn and
introduce some fine-grained TableChanges because the most cases above are
not useful to external catalog, e.g. JDBCCatalog. So I think we can
introduce the ModifyColumn that represents column modification and

```
/** Modify the column comment */
public class ModifyColumnComment extends ModifyColumn {

    String getComment();

}

/** Modify the column position. */
public class ModifyColumnPosition extends ModifyColumn {}

/** Modify the physical column data type. */
public class ModifyPhysicalColumnType extends ModifyColumn {

    DataType getNewType();

}

```

When altering the physical column, the statement will produce the
fine-grained changes. In other cases, we will still produce the base class
ModifyColumn.


> ModifyColumn can also rename the column.

Yes. I have modified the FLIP and moved the RenameColumn and added a class
named ModifyColumnName extends ModifyColumn.

Best,
Shengkai

Reply via email to