sql—配置单元列别名中的奇怪行为

piztneat  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(328)

我试图从允许用户指定列名别名的应用程序中构建一些配置单元(0.9)查询。
我发现,每当列别名有两个字符长,并且是后跟“b”或“b”的数字时,就会出现错误:“无法识别“as”“2b”“in selection target”附近的输入”
不起作用的查询:

select t1.emp_id as 1b from someTable t1;
select t1.emp_id as 2b from someTable t1;
select t1.emp_id as 1B from someTable t1;

有效的查询:

select t1.emp_id as 1b1 from someTable t1;
select t1.emp_id as 1ba from someTable t1;
select t1.emp_id as 1c from someTable t1;

这是Hive中已知的问题吗?我找不到任何与此类错误有关的jira问题。

ykejflvf

ykejflvf1#

攀登给了我们一个很好的答案,为什么会发生这种情况;下面是一个关于如何解决这个问题的答案-只要使用backticks,就像这样:

select t1.emp_id as `1b` from someTable t1;
aiazj4mn

aiazj4mn2#

好吧,我很肯定我找到了。配置单元解析器将其识别为 ByteLengthLiteral 定义如下:

ByteLengthLiteral
    :
    (Digit)+ ('b' | 'B' | 'k' | 'K' | 'm' | 'M' | 'g' | 'G')
    ;

我也试过同样的说法 bk , m ,和 g 也犯了同样的错误。
为了提供信息,一个标识符( as [identifier] )定义为。。。

Identifier
    :
    (Letter | Digit) (Letter | Digit | '_')*
    | '`' RegexComponent+ '`'
    ;

看起来应该有用,只是 ByteLengthLiteral 已处理,因此无法识别标识符。

相关问题