Skip to content

Commit 87a503f

Browse files
authored
HIVE-29329: Negative value in DEFAULT constraint throwing ParseException. (#6204)
1 parent 1a48853 commit 87a503f

File tree

5 files changed

+226
-7
lines changed

5 files changed

+226
-7
lines changed

parser/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2363,9 +2363,10 @@ columnConstraintType
23632363
;
23642364
23652365
defaultVal
2366-
: constant
2367-
| function
2368-
| castExpression
2366+
: ((PLUS | MINUS)^) unsignedNumericLiterals
2367+
| constant
2368+
| ((PLUS | MINUS)^)? function
2369+
| ((PLUS | MINUS)^)? castExpression
23692370
;
23702371
23712372
tableConstraintType

parser/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -438,19 +438,23 @@ timeUnitQualifiers
438438
| KW_MINUTE -> Identifier["minutes"]
439439
;
440440

441+
unsignedNumericLiterals
442+
: Number
443+
| IntegralLiteral
444+
| NumberLiteral
445+
;
446+
441447
constant
442448
@init { gParent.pushMsg("constant", state); }
443449
@after { gParent.popMsg(state); }
444450
:
445451
(intervalLiteral) => intervalLiteral
446-
| Number
452+
| unsignedNumericLiterals
447453
| dateLiteral
448454
| timestampLiteral
449455
| timestampLocalTZLiteral
450456
| StringLiteral
451457
| stringLiteralSequence
452-
| IntegralLiteral
453-
| NumberLiteral
454458
| charSetStringLiteral
455459
| booleanValue
456460
| KW_NULL -> TOK_NULL

ql/src/java/org/apache/hadoop/hive/ql/ddl/table/constraint/ConstraintsUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ private static List<ConstraintInfo> generateConstraintInfos(ASTNode child, List<
310310
* @return retrieve the default value and return it as string
311311
*/
312312
private static Pair<TypeInfo, String> getDefaultValueAndType(ASTNode node, TokenRewriteStream tokenStream)
313-
throws SemanticException{
313+
throws SemanticException {
314314
// first create expression from defaultValueAST
315315
TypeCheckCtx typeCheckCtx = new TypeCheckCtx(null);
316316
ExprNodeDesc defaultValExpr = ExprNodeTypeCheck.genExprNode(node, typeCheckCtx).get(node);
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
CREATE TABLE tab_default_cons(c0 boolean, c1 int DEFAULT -15);
2+
insert into tab_default_cons values(true, default);
3+
insert into tab_default_cons values(false, 10);
4+
select * from tab_default_cons;
5+
6+
CREATE TABLE tab_default_cons1(c0 boolean, c1 double DEFAULT -log2(16));
7+
insert into tab_default_cons1 values(true, default);
8+
insert into tab_default_cons1 values(false, 20);
9+
select * from tab_default_cons1;
10+
11+
CREATE TABLE tab_default_cons2(c0 boolean, c1 int DEFAULT -cast(-trim(' 12 ') as int));
12+
insert into tab_default_cons2 values(true, default);
13+
insert into tab_default_cons2 values(false, 30);
14+
select * from tab_default_cons2;
15+
16+
CREATE TABLE tab_default_cons3(c0 boolean, c1 int DEFAULT +25);
17+
insert into tab_default_cons3 values(true, default);
18+
insert into tab_default_cons3 values(false, 40);
19+
select * from tab_default_cons3;
20+
21+
CREATE TABLE tab_default_cons4(c0 boolean, c1 double DEFAULT cast(121 as double));
22+
insert into tab_default_cons4 values(false, default);
23+
insert into tab_default_cons4 values(true, 50);
24+
select * from tab_default_cons4;
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
PREHOOK: query: CREATE TABLE tab_default_cons(c0 boolean, c1 int DEFAULT -15)
2+
PREHOOK: type: CREATETABLE
3+
PREHOOK: Output: database:default
4+
PREHOOK: Output: default@tab_default_cons
5+
POSTHOOK: query: CREATE TABLE tab_default_cons(c0 boolean, c1 int DEFAULT -15)
6+
POSTHOOK: type: CREATETABLE
7+
POSTHOOK: Output: database:default
8+
POSTHOOK: Output: default@tab_default_cons
9+
PREHOOK: query: insert into tab_default_cons values(true, default)
10+
PREHOOK: type: QUERY
11+
PREHOOK: Input: _dummy_database@_dummy_table
12+
PREHOOK: Output: default@tab_default_cons
13+
POSTHOOK: query: insert into tab_default_cons values(true, default)
14+
POSTHOOK: type: QUERY
15+
POSTHOOK: Input: _dummy_database@_dummy_table
16+
POSTHOOK: Output: default@tab_default_cons
17+
POSTHOOK: Lineage: tab_default_cons.c0 SCRIPT []
18+
POSTHOOK: Lineage: tab_default_cons.c1 SCRIPT []
19+
PREHOOK: query: insert into tab_default_cons values(false, 10)
20+
PREHOOK: type: QUERY
21+
PREHOOK: Input: _dummy_database@_dummy_table
22+
PREHOOK: Output: default@tab_default_cons
23+
POSTHOOK: query: insert into tab_default_cons values(false, 10)
24+
POSTHOOK: type: QUERY
25+
POSTHOOK: Input: _dummy_database@_dummy_table
26+
POSTHOOK: Output: default@tab_default_cons
27+
POSTHOOK: Lineage: tab_default_cons.c0 SCRIPT []
28+
POSTHOOK: Lineage: tab_default_cons.c1 SCRIPT []
29+
PREHOOK: query: select * from tab_default_cons
30+
PREHOOK: type: QUERY
31+
PREHOOK: Input: default@tab_default_cons
32+
#### A masked pattern was here ####
33+
POSTHOOK: query: select * from tab_default_cons
34+
POSTHOOK: type: QUERY
35+
POSTHOOK: Input: default@tab_default_cons
36+
#### A masked pattern was here ####
37+
true -15
38+
false 10
39+
PREHOOK: query: CREATE TABLE tab_default_cons1(c0 boolean, c1 double DEFAULT -log2(16))
40+
PREHOOK: type: CREATETABLE
41+
PREHOOK: Output: database:default
42+
PREHOOK: Output: default@tab_default_cons1
43+
POSTHOOK: query: CREATE TABLE tab_default_cons1(c0 boolean, c1 double DEFAULT -log2(16))
44+
POSTHOOK: type: CREATETABLE
45+
POSTHOOK: Output: database:default
46+
POSTHOOK: Output: default@tab_default_cons1
47+
PREHOOK: query: insert into tab_default_cons1 values(true, default)
48+
PREHOOK: type: QUERY
49+
PREHOOK: Input: _dummy_database@_dummy_table
50+
PREHOOK: Output: default@tab_default_cons1
51+
POSTHOOK: query: insert into tab_default_cons1 values(true, default)
52+
POSTHOOK: type: QUERY
53+
POSTHOOK: Input: _dummy_database@_dummy_table
54+
POSTHOOK: Output: default@tab_default_cons1
55+
POSTHOOK: Lineage: tab_default_cons1.c0 SCRIPT []
56+
POSTHOOK: Lineage: tab_default_cons1.c1 SCRIPT []
57+
PREHOOK: query: insert into tab_default_cons1 values(false, 20)
58+
PREHOOK: type: QUERY
59+
PREHOOK: Input: _dummy_database@_dummy_table
60+
PREHOOK: Output: default@tab_default_cons1
61+
POSTHOOK: query: insert into tab_default_cons1 values(false, 20)
62+
POSTHOOK: type: QUERY
63+
POSTHOOK: Input: _dummy_database@_dummy_table
64+
POSTHOOK: Output: default@tab_default_cons1
65+
POSTHOOK: Lineage: tab_default_cons1.c0 SCRIPT []
66+
POSTHOOK: Lineage: tab_default_cons1.c1 SCRIPT []
67+
PREHOOK: query: select * from tab_default_cons1
68+
PREHOOK: type: QUERY
69+
PREHOOK: Input: default@tab_default_cons1
70+
#### A masked pattern was here ####
71+
POSTHOOK: query: select * from tab_default_cons1
72+
POSTHOOK: type: QUERY
73+
POSTHOOK: Input: default@tab_default_cons1
74+
#### A masked pattern was here ####
75+
true -4.0
76+
false 20.0
77+
PREHOOK: query: CREATE TABLE tab_default_cons2(c0 boolean, c1 int DEFAULT -cast(-trim(' 12 ') as int))
78+
PREHOOK: type: CREATETABLE
79+
PREHOOK: Output: database:default
80+
PREHOOK: Output: default@tab_default_cons2
81+
POSTHOOK: query: CREATE TABLE tab_default_cons2(c0 boolean, c1 int DEFAULT -cast(-trim(' 12 ') as int))
82+
POSTHOOK: type: CREATETABLE
83+
POSTHOOK: Output: database:default
84+
POSTHOOK: Output: default@tab_default_cons2
85+
PREHOOK: query: insert into tab_default_cons2 values(true, default)
86+
PREHOOK: type: QUERY
87+
PREHOOK: Input: _dummy_database@_dummy_table
88+
PREHOOK: Output: default@tab_default_cons2
89+
POSTHOOK: query: insert into tab_default_cons2 values(true, default)
90+
POSTHOOK: type: QUERY
91+
POSTHOOK: Input: _dummy_database@_dummy_table
92+
POSTHOOK: Output: default@tab_default_cons2
93+
POSTHOOK: Lineage: tab_default_cons2.c0 SCRIPT []
94+
POSTHOOK: Lineage: tab_default_cons2.c1 SCRIPT []
95+
PREHOOK: query: insert into tab_default_cons2 values(false, 30)
96+
PREHOOK: type: QUERY
97+
PREHOOK: Input: _dummy_database@_dummy_table
98+
PREHOOK: Output: default@tab_default_cons2
99+
POSTHOOK: query: insert into tab_default_cons2 values(false, 30)
100+
POSTHOOK: type: QUERY
101+
POSTHOOK: Input: _dummy_database@_dummy_table
102+
POSTHOOK: Output: default@tab_default_cons2
103+
POSTHOOK: Lineage: tab_default_cons2.c0 SCRIPT []
104+
POSTHOOK: Lineage: tab_default_cons2.c1 SCRIPT []
105+
PREHOOK: query: select * from tab_default_cons2
106+
PREHOOK: type: QUERY
107+
PREHOOK: Input: default@tab_default_cons2
108+
#### A masked pattern was here ####
109+
POSTHOOK: query: select * from tab_default_cons2
110+
POSTHOOK: type: QUERY
111+
POSTHOOK: Input: default@tab_default_cons2
112+
#### A masked pattern was here ####
113+
true 12
114+
false 30
115+
PREHOOK: query: CREATE TABLE tab_default_cons3(c0 boolean, c1 int DEFAULT +25)
116+
PREHOOK: type: CREATETABLE
117+
PREHOOK: Output: database:default
118+
PREHOOK: Output: default@tab_default_cons3
119+
POSTHOOK: query: CREATE TABLE tab_default_cons3(c0 boolean, c1 int DEFAULT +25)
120+
POSTHOOK: type: CREATETABLE
121+
POSTHOOK: Output: database:default
122+
POSTHOOK: Output: default@tab_default_cons3
123+
PREHOOK: query: insert into tab_default_cons3 values(true, default)
124+
PREHOOK: type: QUERY
125+
PREHOOK: Input: _dummy_database@_dummy_table
126+
PREHOOK: Output: default@tab_default_cons3
127+
POSTHOOK: query: insert into tab_default_cons3 values(true, default)
128+
POSTHOOK: type: QUERY
129+
POSTHOOK: Input: _dummy_database@_dummy_table
130+
POSTHOOK: Output: default@tab_default_cons3
131+
POSTHOOK: Lineage: tab_default_cons3.c0 SCRIPT []
132+
POSTHOOK: Lineage: tab_default_cons3.c1 SCRIPT []
133+
PREHOOK: query: insert into tab_default_cons3 values(false, 40)
134+
PREHOOK: type: QUERY
135+
PREHOOK: Input: _dummy_database@_dummy_table
136+
PREHOOK: Output: default@tab_default_cons3
137+
POSTHOOK: query: insert into tab_default_cons3 values(false, 40)
138+
POSTHOOK: type: QUERY
139+
POSTHOOK: Input: _dummy_database@_dummy_table
140+
POSTHOOK: Output: default@tab_default_cons3
141+
POSTHOOK: Lineage: tab_default_cons3.c0 SCRIPT []
142+
POSTHOOK: Lineage: tab_default_cons3.c1 SCRIPT []
143+
PREHOOK: query: select * from tab_default_cons3
144+
PREHOOK: type: QUERY
145+
PREHOOK: Input: default@tab_default_cons3
146+
#### A masked pattern was here ####
147+
POSTHOOK: query: select * from tab_default_cons3
148+
POSTHOOK: type: QUERY
149+
POSTHOOK: Input: default@tab_default_cons3
150+
#### A masked pattern was here ####
151+
true 25
152+
false 40
153+
PREHOOK: query: CREATE TABLE tab_default_cons4(c0 boolean, c1 double DEFAULT cast(121 as double))
154+
PREHOOK: type: CREATETABLE
155+
PREHOOK: Output: database:default
156+
PREHOOK: Output: default@tab_default_cons4
157+
POSTHOOK: query: CREATE TABLE tab_default_cons4(c0 boolean, c1 double DEFAULT cast(121 as double))
158+
POSTHOOK: type: CREATETABLE
159+
POSTHOOK: Output: database:default
160+
POSTHOOK: Output: default@tab_default_cons4
161+
PREHOOK: query: insert into tab_default_cons4 values(false, default)
162+
PREHOOK: type: QUERY
163+
PREHOOK: Input: _dummy_database@_dummy_table
164+
PREHOOK: Output: default@tab_default_cons4
165+
POSTHOOK: query: insert into tab_default_cons4 values(false, default)
166+
POSTHOOK: type: QUERY
167+
POSTHOOK: Input: _dummy_database@_dummy_table
168+
POSTHOOK: Output: default@tab_default_cons4
169+
POSTHOOK: Lineage: tab_default_cons4.c0 SCRIPT []
170+
POSTHOOK: Lineage: tab_default_cons4.c1 SCRIPT []
171+
PREHOOK: query: insert into tab_default_cons4 values(true, 50)
172+
PREHOOK: type: QUERY
173+
PREHOOK: Input: _dummy_database@_dummy_table
174+
PREHOOK: Output: default@tab_default_cons4
175+
POSTHOOK: query: insert into tab_default_cons4 values(true, 50)
176+
POSTHOOK: type: QUERY
177+
POSTHOOK: Input: _dummy_database@_dummy_table
178+
POSTHOOK: Output: default@tab_default_cons4
179+
POSTHOOK: Lineage: tab_default_cons4.c0 SCRIPT []
180+
POSTHOOK: Lineage: tab_default_cons4.c1 SCRIPT []
181+
PREHOOK: query: select * from tab_default_cons4
182+
PREHOOK: type: QUERY
183+
PREHOOK: Input: default@tab_default_cons4
184+
#### A masked pattern was here ####
185+
POSTHOOK: query: select * from tab_default_cons4
186+
POSTHOOK: type: QUERY
187+
POSTHOOK: Input: default@tab_default_cons4
188+
#### A masked pattern was here ####
189+
false 121.0
190+
true 50.0

0 commit comments

Comments
 (0)