[
https://issues.apache.org/jira/browse/HIVE-29570?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18074212#comment-18074212
]
Kokila N edited comment on HIVE-29570 at 4/17/26 11:09 AM:
-----------------------------------------------------------
*Root Cause:*
{{MERGE}} is rewritten into a {{{}_insert,select_ statements{}}}. During this
rewrite, Hive regenerates SQL text from the AST using
{_}{{HiveUtils.collectUnescapeIdentifierTranslations()}}{_}.
After HIVE-29187, {{collectUnescapeIdentifierTranslations()}} started visiting
every _{{Identifier}}_ and skipped quoting for any identifier whose text
matched a built-in function name (via the function registry).
So, when column names like *{{date}}* match function, the translator did not
quote the column identifier.
As a result, the rewritten SQL contains will be *`s`.date which throws parse
error_._*
was (Author: JIRAUSER298458):
*Root Cause:*
{{MERGE}} is rewritten into a {{{}_insert,select_ statements{}}}. During this
rewrite, Hive regenerates SQL text from the AST using
{_}{{HiveUtils.collectUnescapeIdentifierTranslations()}}{_}.
After HIVE-29187, {{collectUnescapeIdentifierTranslations()}} started visiting
every {{Identifier}} and skipped quoting for any identifier whose text matched
a built-in function name (via the function registry).
So, when column names like *{{date}}* match function, the translator did not
quote the column identifier.
As a result, the rewritten SQL contains will be {{_`s`.date_ which throws parse
error.}}
> Fix Hive MERGE query parse failure when using backtick-quoted keyword column
> names
> ----------------------------------------------------------------------------------
>
> Key: HIVE-29570
> URL: https://issues.apache.org/jira/browse/HIVE-29570
> Project: Hive
> Issue Type: Bug
> Reporter: Kokila N
> Assignee: Kokila N
> Priority: Major
>
> Merge query fails with parse error when column name is of function name
> (date)
> *Query:*
> {code:java}
> create table acidTbl_kw(a int, `date` int) clustered by (a) into 2 buckets
> stored as orc
> TBLPROPERTIES ('transactional'='true');
> create table nonAcidOrcTbl_kw(a int, `date` int) clustered by (a) into 2
> buckets stored as orc
> TBLPROPERTIES ('transactional'='false');
> explain merge into acidTbl_kw as t using nonAcidOrcTbl_kw s ON t.`a` = s.`a`
> WHEN MATCHED THEN UPDATE SET `date` = s.`date`
> WHEN NOT MATCHED THEN INSERT VALUES(s.`a`, s.`date`);{code}
> *Error:*
> {code:java}
> org.apache.hadoop.hive.ql.parse.SemanticException: Encountered parse error
> while parsing rewritten merge/update or delete query
>
> at
> org.apache.hadoop.hive.ql.parse.ParseUtils.parseRewrittenQuery(ParseUtils.java:747)
>
>
> at
> org.apache.hadoop.hive.ql.parse.rewrite.MergeRewriter.rewrite(MergeRewriter.java:86)
>
>
> at
> org.apache.hadoop.hive.ql.parse.rewrite.MergeRewriter.rewrite(MergeRewriter.java:54)
>
>
> at
> org.apache.hadoop.hive.ql.parse.RewriteSemanticAnalyzer.rewriteAndAnalyze(RewriteSemanticAnalyzer.java:94)
>
>
> at
> org.apache.hadoop.hive.ql.parse.MergeSemanticAnalyzer.analyze(MergeSemanticAnalyzer.java:207)
>
>
> at
> org.apache.hadoop.hive.ql.parse.RewriteSemanticAnalyzer.analyze(RewriteSemanticAnalyzer.java:85)
>
>
> at
> org.apache.hadoop.hive.ql.parse.RewriteSemanticAnalyzer.analyzeInternal(RewriteSemanticAnalyzer.java:73)
>
>
> at
> org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.analyze(BaseSemanticAnalyzer.java:358)
>
>
> at
> org.apache.hadoop.hive.ql.parse.ExplainSemanticAnalyzer.analyzeInternal(ExplainSemanticAnalyzer.java:187)
>
>
> at
> org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.analyze(BaseSemanticAnalyzer.java:358)
>
>
> ....
>
>
> Caused by: org.apache.hadoop.hive.ql.parse.ParseException: line 11:22 cannot
> recognize input near 's' '.' 'date' in selection target
>
> at
> org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:125)
>
>
> at
> org.apache.hadoop.hive.ql.parse.ParseUtils.parse(ParseUtils.java:101)
>
>
> at
> org.apache.hadoop.hive.ql.parse.ParseUtils.parse(ParseUtils.java:93)
>
>
> at
> org.apache.hadoop.hive.ql.parse.ParseUtils.parseRewrittenQuery(ParseUtils.java:745)
>
>
> ... 64 more
>
>
> Caused by: NoViableAltException(99@[80:1: selectItem : ( ( tableAllColumns
> )=> tableAllColumns -> ^( TOK_SELEXPR tableAllColumns ) | ( expression ( ( (
> KW_AS )? identifier ) | ( KW_AS LPAREN identifier ( COMMA identifier )*
> RPAREN ) )? ) -> ^( TOK_SELEXPR expression ( identifier )* ) );])
>
>
> at
> org.apache.hadoop.hive.ql.parse.HiveParser_SelectClauseParser$DFA13.specialStateTransition(HiveParser_SelectClauseParser.java:5211)
>
> at org.antlr.runtime.DFA.predict(DFA.java:80)
>
>
> at
> org.apache.hadoop.hive.ql.parse.HiveParser_SelectClauseParser.selectItem(HiveParser_SelectClauseParser.java:1835)
>
>
> at
> org.apache.hadoop.hive.ql.parse.HiveParser_SelectClauseParser.selectList(HiveParser_SelectClauseParser.java:1396)
>
>
> at
> org.apache.hadoop.hive.ql.parse.HiveParser_SelectClauseParser.selectClause(HiveParser_SelectClauseParser.java:1166)
>
>
> at
> org.apache.hadoop.hive.ql.parse.HiveParser.selectClause(HiveParser.java:43926)
>
>
> at
> org.apache.hadoop.hive.ql.parse.HiveParser.body(HiveParser.java:38957)
>
>
> at
> org.apache.hadoop.hive.ql.parse.HiveParser.singleFromStatement(HiveParser.java:37559)
>
>
> at
> org.apache.hadoop.hive.ql.parse.HiveParser.fromStatement(HiveParser.java:37317)
>
>
> at
> org.apache.hadoop.hive.ql.parse.HiveParser.queryStatementExpressionBody(HiveParser.java:36974)
>
>
> at
> org.apache.hadoop.hive.ql.parse.HiveParser.queryStatementExpression(HiveParser.java:36876)
>
>
> at
> org.apache.hadoop.hive.ql.parse.HiveParser.execStatement(HiveParser.java:2787)
>
>
> at
> org.apache.hadoop.hive.ql.parse.HiveParser.statement(HiveParser.java:1666)
>
>
> at
> org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:123)
>
>
> ... 67 more {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)