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

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


The following commit(s) were added to refs/heads/master by this push:
     new 87a503fae3f HIVE-29329: Negative value in DEFAULT constraint throwing 
ParseException. (#6204)
87a503fae3f is described below

commit 87a503fae3f88060cc75a7a1866bfc20e89f22cf
Author: Dayakar M <[email protected]>
AuthorDate: Tue Nov 25 13:28:40 2025 +0530

    HIVE-29329: Negative value in DEFAULT constraint throwing ParseException. 
(#6204)
---
 .../org/apache/hadoop/hive/ql/parse/HiveParser.g   |   7 +-
 .../hadoop/hive/ql/parse/IdentifiersParser.g       |  10 +-
 .../ql/ddl/table/constraint/ConstraintsUtils.java  |   2 +-
 .../default_constraint_negative_value.q            |  24 +++
 .../llap/default_constraint_negative_value.q.out   | 190 +++++++++++++++++++++
 5 files changed, 226 insertions(+), 7 deletions(-)

diff --git a/parser/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g 
b/parser/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
index c2bc3d25cfe..e12b2e016a2 100644
--- a/parser/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
+++ b/parser/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
@@ -2363,9 +2363,10 @@ columnConstraintType
     ;
 
 defaultVal
-    : constant
-    | function
-    | castExpression
+    : ((PLUS | MINUS)^) unsignedNumericLiterals
+    | constant
+    | ((PLUS | MINUS)^)? function
+    | ((PLUS | MINUS)^)? castExpression
     ;
 
 tableConstraintType
diff --git 
a/parser/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g 
b/parser/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g
index e013be55995..ac9053cf284 100644
--- a/parser/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g
+++ b/parser/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g
@@ -438,19 +438,23 @@ timeUnitQualifiers
     | KW_MINUTE -> Identifier["minutes"]
     ;
 
+unsignedNumericLiterals
+    : Number
+    | IntegralLiteral
+    | NumberLiteral
+    ;
+
 constant
 @init { gParent.pushMsg("constant", state); }
 @after { gParent.popMsg(state); }
     : 
     (intervalLiteral) => intervalLiteral
-    | Number
+    | unsignedNumericLiterals
     | dateLiteral
     | timestampLiteral
     | timestampLocalTZLiteral
     | StringLiteral
     | stringLiteralSequence
-    | IntegralLiteral
-    | NumberLiteral
     | charSetStringLiteral
     | booleanValue
     | KW_NULL -> TOK_NULL
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/constraint/ConstraintsUtils.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/constraint/ConstraintsUtils.java
index daac11c1858..83f733b0703 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/constraint/ConstraintsUtils.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/constraint/ConstraintsUtils.java
@@ -310,7 +310,7 @@ private static List<ConstraintInfo> 
generateConstraintInfos(ASTNode child, List<
    * @return retrieve the default value and return it as string
    */
   private static Pair<TypeInfo, String> getDefaultValueAndType(ASTNode node, 
TokenRewriteStream tokenStream)
-      throws SemanticException{
+      throws SemanticException {
     // first create expression from defaultValueAST
     TypeCheckCtx typeCheckCtx = new TypeCheckCtx(null);
     ExprNodeDesc defaultValExpr = ExprNodeTypeCheck.genExprNode(node, 
typeCheckCtx).get(node);
diff --git 
a/ql/src/test/queries/clientpositive/default_constraint_negative_value.q 
b/ql/src/test/queries/clientpositive/default_constraint_negative_value.q
new file mode 100644
index 00000000000..2683c9d21d7
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/default_constraint_negative_value.q
@@ -0,0 +1,24 @@
+CREATE TABLE tab_default_cons(c0 boolean, c1 int DEFAULT -15);
+insert into tab_default_cons values(true, default);
+insert into tab_default_cons values(false, 10);
+select * from tab_default_cons;
+
+CREATE TABLE tab_default_cons1(c0 boolean, c1 double DEFAULT -log2(16));
+insert into tab_default_cons1 values(true, default);
+insert into tab_default_cons1 values(false, 20);
+select * from tab_default_cons1;
+
+CREATE TABLE tab_default_cons2(c0 boolean, c1 int DEFAULT -cast(-trim(' 12 ') 
as int));
+insert into tab_default_cons2 values(true, default);
+insert into tab_default_cons2 values(false, 30);
+select * from tab_default_cons2;
+
+CREATE TABLE tab_default_cons3(c0 boolean, c1 int DEFAULT +25);
+insert into tab_default_cons3 values(true, default);
+insert into tab_default_cons3 values(false, 40);
+select * from tab_default_cons3;
+
+CREATE TABLE tab_default_cons4(c0 boolean, c1 double DEFAULT cast(121 as 
double));
+insert into tab_default_cons4 values(false, default);
+insert into tab_default_cons4 values(true, 50);
+select * from tab_default_cons4;
\ No newline at end of file
diff --git 
a/ql/src/test/results/clientpositive/llap/default_constraint_negative_value.q.out
 
b/ql/src/test/results/clientpositive/llap/default_constraint_negative_value.q.out
new file mode 100644
index 00000000000..32dbcc8f79a
--- /dev/null
+++ 
b/ql/src/test/results/clientpositive/llap/default_constraint_negative_value.q.out
@@ -0,0 +1,190 @@
+PREHOOK: query: CREATE TABLE tab_default_cons(c0 boolean, c1 int DEFAULT -15)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@tab_default_cons
+POSTHOOK: query: CREATE TABLE tab_default_cons(c0 boolean, c1 int DEFAULT -15)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@tab_default_cons
+PREHOOK: query: insert into tab_default_cons values(true, default)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@tab_default_cons
+POSTHOOK: query: insert into tab_default_cons values(true, default)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@tab_default_cons
+POSTHOOK: Lineage: tab_default_cons.c0 SCRIPT []
+POSTHOOK: Lineage: tab_default_cons.c1 SCRIPT []
+PREHOOK: query: insert into tab_default_cons values(false, 10)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@tab_default_cons
+POSTHOOK: query: insert into tab_default_cons values(false, 10)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@tab_default_cons
+POSTHOOK: Lineage: tab_default_cons.c0 SCRIPT []
+POSTHOOK: Lineage: tab_default_cons.c1 SCRIPT []
+PREHOOK: query: select * from tab_default_cons
+PREHOOK: type: QUERY
+PREHOOK: Input: default@tab_default_cons
+#### A masked pattern was here ####
+POSTHOOK: query: select * from tab_default_cons
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@tab_default_cons
+#### A masked pattern was here ####
+true   -15
+false  10
+PREHOOK: query: CREATE TABLE tab_default_cons1(c0 boolean, c1 double DEFAULT 
-log2(16))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@tab_default_cons1
+POSTHOOK: query: CREATE TABLE tab_default_cons1(c0 boolean, c1 double DEFAULT 
-log2(16))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@tab_default_cons1
+PREHOOK: query: insert into tab_default_cons1 values(true, default)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@tab_default_cons1
+POSTHOOK: query: insert into tab_default_cons1 values(true, default)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@tab_default_cons1
+POSTHOOK: Lineage: tab_default_cons1.c0 SCRIPT []
+POSTHOOK: Lineage: tab_default_cons1.c1 SCRIPT []
+PREHOOK: query: insert into tab_default_cons1 values(false, 20)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@tab_default_cons1
+POSTHOOK: query: insert into tab_default_cons1 values(false, 20)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@tab_default_cons1
+POSTHOOK: Lineage: tab_default_cons1.c0 SCRIPT []
+POSTHOOK: Lineage: tab_default_cons1.c1 SCRIPT []
+PREHOOK: query: select * from tab_default_cons1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@tab_default_cons1
+#### A masked pattern was here ####
+POSTHOOK: query: select * from tab_default_cons1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@tab_default_cons1
+#### A masked pattern was here ####
+true   -4.0
+false  20.0
+PREHOOK: query: CREATE TABLE tab_default_cons2(c0 boolean, c1 int DEFAULT 
-cast(-trim(' 12 ') as int))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@tab_default_cons2
+POSTHOOK: query: CREATE TABLE tab_default_cons2(c0 boolean, c1 int DEFAULT 
-cast(-trim(' 12 ') as int))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@tab_default_cons2
+PREHOOK: query: insert into tab_default_cons2 values(true, default)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@tab_default_cons2
+POSTHOOK: query: insert into tab_default_cons2 values(true, default)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@tab_default_cons2
+POSTHOOK: Lineage: tab_default_cons2.c0 SCRIPT []
+POSTHOOK: Lineage: tab_default_cons2.c1 SCRIPT []
+PREHOOK: query: insert into tab_default_cons2 values(false, 30)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@tab_default_cons2
+POSTHOOK: query: insert into tab_default_cons2 values(false, 30)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@tab_default_cons2
+POSTHOOK: Lineage: tab_default_cons2.c0 SCRIPT []
+POSTHOOK: Lineage: tab_default_cons2.c1 SCRIPT []
+PREHOOK: query: select * from tab_default_cons2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@tab_default_cons2
+#### A masked pattern was here ####
+POSTHOOK: query: select * from tab_default_cons2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@tab_default_cons2
+#### A masked pattern was here ####
+true   12
+false  30
+PREHOOK: query: CREATE TABLE tab_default_cons3(c0 boolean, c1 int DEFAULT +25)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@tab_default_cons3
+POSTHOOK: query: CREATE TABLE tab_default_cons3(c0 boolean, c1 int DEFAULT +25)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@tab_default_cons3
+PREHOOK: query: insert into tab_default_cons3 values(true, default)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@tab_default_cons3
+POSTHOOK: query: insert into tab_default_cons3 values(true, default)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@tab_default_cons3
+POSTHOOK: Lineage: tab_default_cons3.c0 SCRIPT []
+POSTHOOK: Lineage: tab_default_cons3.c1 SCRIPT []
+PREHOOK: query: insert into tab_default_cons3 values(false, 40)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@tab_default_cons3
+POSTHOOK: query: insert into tab_default_cons3 values(false, 40)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@tab_default_cons3
+POSTHOOK: Lineage: tab_default_cons3.c0 SCRIPT []
+POSTHOOK: Lineage: tab_default_cons3.c1 SCRIPT []
+PREHOOK: query: select * from tab_default_cons3
+PREHOOK: type: QUERY
+PREHOOK: Input: default@tab_default_cons3
+#### A masked pattern was here ####
+POSTHOOK: query: select * from tab_default_cons3
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@tab_default_cons3
+#### A masked pattern was here ####
+true   25
+false  40
+PREHOOK: query: CREATE TABLE tab_default_cons4(c0 boolean, c1 double DEFAULT 
cast(121 as double))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@tab_default_cons4
+POSTHOOK: query: CREATE TABLE tab_default_cons4(c0 boolean, c1 double DEFAULT 
cast(121 as double))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@tab_default_cons4
+PREHOOK: query: insert into tab_default_cons4 values(false, default)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@tab_default_cons4
+POSTHOOK: query: insert into tab_default_cons4 values(false, default)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@tab_default_cons4
+POSTHOOK: Lineage: tab_default_cons4.c0 SCRIPT []
+POSTHOOK: Lineage: tab_default_cons4.c1 SCRIPT []
+PREHOOK: query: insert into tab_default_cons4 values(true, 50)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@tab_default_cons4
+POSTHOOK: query: insert into tab_default_cons4 values(true, 50)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@tab_default_cons4
+POSTHOOK: Lineage: tab_default_cons4.c0 SCRIPT []
+POSTHOOK: Lineage: tab_default_cons4.c1 SCRIPT []
+PREHOOK: query: select * from tab_default_cons4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@tab_default_cons4
+#### A masked pattern was here ####
+POSTHOOK: query: select * from tab_default_cons4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@tab_default_cons4
+#### A masked pattern was here ####
+false  121.0
+true   50.0

Reply via email to