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