This is an automated email from the ASF dual-hosted git repository.

stigahuang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/impala.git

commit 76a8efb155d2ea3a9a1d36f2bd5428fd5ffa1d2d
Author: Daniel Vanko <[email protected]>
AuthorDate: Fri Mar 14 16:38:52 2025 +0100

    IMPALA-13859: Add decimal to Kudu's supported primary key types
    
    Add DECIMAL to KuduUtil.isSupportedKeyType because it is a supported
    type for primary key by Kudu.
    
    Testing:
     * add fe tests
     * add e2e tests
    
    Change-Id: I0e8685fe89e4e4e511ab1d815c51ca5a021b4081
    Reviewed-on: http://gerrit.cloudera.org:8080/22674
    Tested-by: Impala Public Jenkins <[email protected]>
    Reviewed-by: Zoltan Borok-Nagy <[email protected]>
---
 .../main/java/org/apache/impala/util/KuduUtil.java |  2 +-
 .../apache/impala/analysis/AnalyzeKuduDDLTest.java | 16 +++++++++
 .../queries/QueryTest/kudu_create.test             | 42 ++++++++++++++++++++++
 3 files changed, 59 insertions(+), 1 deletion(-)

diff --git a/fe/src/main/java/org/apache/impala/util/KuduUtil.java 
b/fe/src/main/java/org/apache/impala/util/KuduUtil.java
index ee873a735..3fa51edfe 100644
--- a/fe/src/main/java/org/apache/impala/util/KuduUtil.java
+++ b/fe/src/main/java/org/apache/impala/util/KuduUtil.java
@@ -390,7 +390,7 @@ public class KuduUtil {
   }
 
   public static boolean isSupportedKeyType(org.apache.impala.catalog.Type 
type) {
-    return type.isIntegerType() || type.isStringType() || type.isTimestamp()
+    return type.isFixedPointType() || type.isStringType() || type.isTimestamp()
         || type.isDate();
   }
 
diff --git 
a/fe/src/test/java/org/apache/impala/analysis/AnalyzeKuduDDLTest.java 
b/fe/src/test/java/org/apache/impala/analysis/AnalyzeKuduDDLTest.java
index ed6d8d775..5a7b96774 100644
--- a/fe/src/test/java/org/apache/impala/analysis/AnalyzeKuduDDLTest.java
+++ b/fe/src/test/java/org/apache/impala/analysis/AnalyzeKuduDDLTest.java
@@ -247,6 +247,10 @@ public class AnalyzeKuduDDLTest extends FrontendTestBase {
         "(partition value = 1, partition value = 'abc', partition 3 <= values) 
" +
         "stored as kudu", "Range partition value 'abc' (type: STRING) is not 
type " +
         "compatible with partitioning column 'a' (type: INT).", 
isExternalPurgeTbl);
+    AnalysisError("create table tab (a int primary key) partition by range (a) 
" +
+        "(partition value = 1.2, partition value = 2) stored as kudu",
+        "Range partition value 1.2 (type: DECIMAL(2,1)) is not type compatible 
with " +
+        "partitioning column 'a' (type: INT).", isExternalPurgeTbl);
     AnalysisError("create table tab (a tinyint primary key) partition by range 
(a) " +
         "(partition value = 128) stored as kudu", "Range partition value 128 " 
+
         "(type: SMALLINT) is not type compatible with partitioning column 'a' 
" +
@@ -263,10 +267,17 @@ public class AnalyzeKuduDDLTest extends FrontendTestBase {
         "(partition value = 9223372036854775808) stored as kudu", "Range 
partition " +
         "value 9223372036854775808 (type: DECIMAL(19,0)) is not type 
compatible with " +
         "partitioning column 'a' (type: BIGINT)", isExternalPurgeTbl);
+    AnalysisError("create table tab (a decimal(18,2) primary key)" +
+        "partition by range (a) (partition value = 0.1234) stored as kudu",
+        "Range partition value 0.1234 (type: DECIMAL(4,4)) is not type 
compatible with " +
+        "partitioning column 'a' (type: DECIMAL(18,2))", isExternalPurgeTbl);
     // Test implicit casting/folding of partition values.
     AnalyzesOk("create table tab (a int primary key) partition by range (a) " +
         "(partition value = false, partition value = true) stored as kudu",
         isExternalPurgeTbl);
+    AnalyzesOk("create table tab (a decimal(18,2) primary key) partition by 
range (a) " +
+        "(partition value = 0, partition 0 < values <= 0.1) stored as kudu",
+        isExternalPurgeTbl);
     // Non-key column used in PARTITION BY
     AnalysisError("create table tab (a int, b string, c bigint, primary key 
(a)) " +
         "partition by range (b) (partition value = 'abc') stored as kudu",
@@ -278,6 +289,11 @@ public class AnalyzeKuduDDLTest extends FrontendTestBase {
         "range (a) (partition value = 1.2, partition value = 2) stored as 
kudu",
         "Range partition value 1.2 (type: DECIMAL(2,1)) is not type compatible 
with " +
         "partitioning column 'a' (type: INT).", isExternalPurgeTbl);
+    // Decimal range partition values
+    AnalyzesOk("create table tab (a decimal(8,2), b int, c int, primary key 
(a, b))" +
+        "partition by hash (a, b) partitions 8, " +
+        "range (a) (partition 0 < values < 1.23, partition 1.23 <= values)" +
+        "stored as kudu", isExternalPurgeTbl);
     // Non-existing column used in PARTITION BY
     AnalysisError("create table tab (a int, b int, primary key (a, b)) " +
         "partition by range(unknown_column) (partition value = 'abc') stored 
as kudu",
diff --git 
a/testdata/workloads/functional-query/queries/QueryTest/kudu_create.test 
b/testdata/workloads/functional-query/queries/QueryTest/kudu_create.test
index 3d168312c..6ee28c8e5 100644
--- a/testdata/workloads/functional-query/queries/QueryTest/kudu_create.test
+++ b/testdata/workloads/functional-query/queries/QueryTest/kudu_create.test
@@ -665,3 +665,45 @@ select id, int_col, auto_incrementing_id from 
non_unique_key_create_tbl15 order
 ---- TYPES
 INT,INT,BIGINT
 ====
+---- QUERY
+# Create Kudu table with decimal primary key and range partitions.
+create table decimal_partitioned_tbl
+  (c1 decimal(10,4) primary key, c2 decimal(15,5), c3 decimal(1,1))
+partition by range (c1) (partition values <= 0.2000, partition 0.2000 < values 
<= 0.7575,
+  partition 0.7575 < values)
+stored as kudu
+---- RESULTS
+'Table has been created.'
+====
+---- QUERY
+show range partitions decimal_partitioned_tbl
+---- RESULTS
+'VALUES < 0.2001'
+'0.2001 <= VALUES < 0.7576'
+'VALUES >= 0.7576'
+---- TYPES
+STRING
+====
+---- QUERY
+insert into decimal_partitioned_tbl
+  select c1, c2, c3 from functional.decimal_tiny order by c1 asc limit 10
+---- RUNTIME_PROFILE
+NumModifiedRows: 10
+NumRowErrors: 0
+====
+---- QUERY
+select c1, c2, c3 from decimal_partitioned_tbl order by c1 asc
+---- RESULTS
+0.0000,100.00000,0.0
+0.1111,101.22222,0.1
+0.2222,102.44444,0.2
+0.3333,103.66666,0.3
+0.4444,104.88888,0.4
+0.5555,106.11110,0.5
+0.6666,107.33332,0.6
+0.7777,108.55554,0.7
+0.8888,109.77776,0.8
+0.9999,110.99998,0.9
+---- TYPES
+DECIMAL,DECIMAL,DECIMAL
+====

Reply via email to