diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java index 1d796d42eb..f04867d024 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java @@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -70,8 +71,8 @@ public class SQLColumnDefinition extends SQLObjectImpl implements SQLTableElemen private SQLExpr unitCount; private SQLExpr unitIndex; private SQLExpr step; - private SQLCharExpr encode; - private SQLCharExpr compression; + private SQLExpr encode; + private SQLExpr compression; protected SQLCharExpr aggType; // for starrocks protected SQLCharExpr bitmap; // for starrocks protected SQLCharExpr indexComment; // for starrocks @@ -80,6 +81,8 @@ public class SQLColumnDefinition extends SQLObjectImpl implements SQLTableElemen private List mappedBy; private List colProperties; + protected SQLIntegerExpr blockSize; // for impala for kudu + private boolean generateByDefault; public SQLCharExpr getIndexComment() { @@ -852,22 +855,30 @@ public List getColProperties() { return colProperties; } - public SQLCharExpr getEncode() { + public SQLExpr getEncode() { return encode; } - public void setEncode(SQLCharExpr encode) { + public void setEncode(SQLExpr encode) { this.encode = encode; } - public SQLCharExpr getCompression() { + public SQLExpr getCompression() { return compression; } - public void setCompression(SQLCharExpr compression) { + public void setCompression(SQLExpr compression) { this.compression = compression; } + public void setBlockSize(SQLIntegerExpr blockSize) { + this.blockSize = blockSize; + } + + public SQLIntegerExpr getBlockSize() { + return blockSize; + } + public List getColPropertiesDirect() { return colProperties; } diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/impala/parser/ImpalaExprParser.java b/core/src/main/java/com/alibaba/druid/sql/dialect/impala/parser/ImpalaExprParser.java index 2ae7ee231d..3067ec18c5 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/impala/parser/ImpalaExprParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/impala/parser/ImpalaExprParser.java @@ -5,6 +5,7 @@ import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLExprHint; import com.alibaba.druid.sql.dialect.hive.parser.HiveExprParser; import com.alibaba.druid.sql.dialect.impala.ast.ImpalaSQLPartitionValue; @@ -25,6 +26,22 @@ public ImpalaExprParser(String sql, SQLParserFeature... features) { dbType = DbType.impala; } + public SQLColumnDefinition parseColumnRest(SQLColumnDefinition column) { + if (lexer.nextIfIdentifier("ENCODING")) { + column.setEncode(this.expr()); + } + + if (lexer.nextIfIdentifier(FnvHash.Constants.COMPRESSION)) { + column.setCompression(this.expr()); + } + + if (lexer.nextIfIdentifier("BLOCK_SIZE")) { + column.setBlockSize(this.integerExpr()); + } + + return super.parseColumnRest(column); + } + public SQLPartition parsePartition() { accept(Token.PARTITION); SQLPartition partitionDef = new SQLPartition(); diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/impala/visitor/ImpalaOutputVisitor.java b/core/src/main/java/com/alibaba/druid/sql/dialect/impala/visitor/ImpalaOutputVisitor.java index 5a0175400d..22051122ae 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/impala/visitor/ImpalaOutputVisitor.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/impala/visitor/ImpalaOutputVisitor.java @@ -165,6 +165,20 @@ public boolean visit(SQLPartition x) { return false; } + protected void printEncoding(SQLColumnDefinition x) { + if (x.getEncode() != null) { + print0(ucase ? " ENCODING " : " encoding "); + x.getEncode().accept(this); + } + } + + protected void printCompression(SQLColumnDefinition x) { + if (x.getCompression() != null) { + print0(ucase ? " COMPRESSION " : " compression "); + x.getCompression().accept(this); + } + } + @Override public boolean visit(SQLPartitionValue x) { if (x instanceof ImpalaSQLPartitionValue) { diff --git a/core/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/core/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 3ba46f7e7e..72febfdb31 100644 --- a/core/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/core/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -3522,19 +3522,36 @@ public boolean visit(SQLColumnDefinition x) { printColumnProperties(x); + printEncoding(x); + + printCompression(x); + + printBlockSize(x); + + this.parameterized = parameterized; + + return false; + } + + protected void printEncoding(SQLColumnDefinition x) { if (x.getEncode() != null) { print0(ucase ? " ENCODE=" : " encode="); x.getEncode().accept(this); } + } + protected void printCompression(SQLColumnDefinition x) { if (x.getCompression() != null) { print0(ucase ? " COMPRESSION=" : " compression="); x.getCompression().accept(this); } + } - this.parameterized = parameterized; - - return false; + protected void printBlockSize(SQLColumnDefinition x) { + if (x.getBlockSize() != null) { + print0(ucase ? " BLOCK_SIZE " : " block_size "); + x.getBlockSize().accept(this); + } } protected void printColumnProperties(SQLColumnDefinition x) { diff --git a/core/src/test/resources/bvt/parser/impala/6.txt b/core/src/test/resources/bvt/parser/impala/6.txt new file mode 100644 index 0000000000..37ecfdeb23 --- /dev/null +++ b/core/src/test/resources/bvt/parser/impala/6.txt @@ -0,0 +1,30 @@ +CREATE TABLE dwd_kudu.t09_miu_shop_commodity_status_log ( + id STRING DEFAULT 0 NOT NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION DEFAULT 0, + shop_commodity_id STRING NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION, + shop_commodity STRING NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION BLOCK_SIZE 1024, + PRIMARY KEY (id) +) PARTITION BY HASH (id) PARTITIONS 8 +COMMENT '商品上下架日志表' +STORED AS KUDU +TBLPROPERTIES ( + 'STATS_GENERATED' = '', + 'impala.lastComputeStatsTime' = '', + 'kudu.master_addresses' = '', + 'numRows' = '' +) +-------------------- +CREATE TABLE dwd_kudu.t09_miu_shop_commodity_status_log ( + id STRING DEFAULT 0 NOT NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION, + shop_commodity_id STRING NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION, + shop_commodity STRING NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION BLOCK_SIZE 1024, + PRIMARY KEY (id) +) +COMMENT '商品上下架日志表' +PARTITION BY HASH (id) PARTITIONS 8 +STORED AS KUDU +TBLPROPERTIES ( + 'STATS_GENERATED' = '', + 'impala.lastComputeStatsTime' = '', + 'kudu.master_addresses' = '', + 'numRows' = '' +) \ No newline at end of file