This is an automated email from the ASF dual-hosted git repository.
mbudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new ad662469a5 [CALCITE-6502] Parser loses position information for
Expression3
ad662469a5 is described below
commit ad662469a50f46b399cb7ffe37fa0445539d8992
Author: Mihai Budiu <[email protected]>
AuthorDate: Thu Jul 25 23:42:47 2024 -0700
[CALCITE-6502] Parser loses position information for Expression3
Signed-off-by: Mihai Budiu <[email protected]>
---
core/src/main/codegen/templates/Parser.jj | 26 ++++++----------------
.../org/apache/calcite/test/SqlValidatorTest.java | 8 +++----
2 files changed, 11 insertions(+), 23 deletions(-)
diff --git a/core/src/main/codegen/templates/Parser.jj
b/core/src/main/codegen/templates/Parser.jj
index 6ba01c6dd0..be994d260b 100644
--- a/core/src/main/codegen/templates/Parser.jj
+++ b/core/src/main/codegen/templates/Parser.jj
@@ -3810,8 +3810,12 @@ List<Object> Expression2(ExprContext exprContext) :
AddExpression2b(list, ExprContext.ACCEPT_SUB_QUERY)
|
<LBRACKET>
- itemOp = getItemOp()
- e = Expression(ExprContext.ACCEPT_SUB_QUERY)
+ ( <OFFSET> { itemOp = SqlLibraryOperators.OFFSET; } <LPAREN> {
e = Expression(ExprContext.ACCEPT_SUB_QUERY); } <RPAREN>
+ | <ORDINAL> { itemOp = SqlLibraryOperators.ORDINAL; } <LPAREN>
{ e = Expression(ExprContext.ACCEPT_SUB_QUERY); } <RPAREN>
+ | <SAFE_OFFSET> { itemOp = SqlLibraryOperators.SAFE_OFFSET; }
<LPAREN> { e = Expression(ExprContext.ACCEPT_SUB_QUERY); } <RPAREN>
+ | <SAFE_ORDINAL> { itemOp = SqlLibraryOperators.SAFE_ORDINAL;
} <LPAREN> { e = Expression(ExprContext.ACCEPT_SUB_QUERY); } <RPAREN>
+ | { itemOp = SqlStdOperatorTable.ITEM; } e =
Expression(ExprContext.ACCEPT_SUB_QUERY)
+ )
<RBRACKET> {
list.add(
new SqlParserUtil.ToTreeListItem(
@@ -3846,22 +3850,6 @@ List<Object> Expression2(ExprContext exprContext) :
)
}
-/** Returns the appropriate ITEM operator for indexing arrays. */
-SqlOperator getItemOp() :
-{
-}
-{
- <OFFSET> { return SqlLibraryOperators.OFFSET; }
-|
- <ORDINAL> { return SqlLibraryOperators.ORDINAL; }
-|
- <SAFE_OFFSET> { return SqlLibraryOperators.SAFE_OFFSET; }
-|
- <SAFE_ORDINAL> { return SqlLibraryOperators.SAFE_ORDINAL; }
-|
- { return SqlStdOperatorTable.ITEM; }
-}
-
/** Parses a comparison operator inside a SOME / ALL predicate. */
SqlKind comp() :
{
@@ -3980,7 +3968,7 @@ SqlNode Expression3(ExprContext exprContext) :
{
if (list1.size() == 1) {
// interpret as single value or query
- return list1.get(0);
+ return list1.get(0).clone(list1.getParserPosition());
} else {
// interpret as row constructor
return SqlStdOperatorTable.ROW.createCall(span().end(list1),
diff --git a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
index 3e7164765a..927274d21c 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
@@ -5364,7 +5364,7 @@ public class SqlValidatorTest extends
SqlValidatorTestCase {
@Test void testJoinOnScalarFails() {
final String sql = "select * from emp as e join dept d\n"
- + "on d.deptno = (^select 1, 2 from emp where deptno < e.deptno^)";
+ + "on d.deptno = ^(select 1, 2 from emp where deptno < e.deptno)^";
final String expected = "(?s)Cannot apply '\\$SCALAR_QUERY' to arguments "
+ "of type '\\$SCALAR_QUERY\\(<RECORDTYPE\\(INTEGER EXPR\\$0, INTEGER "
+ "EXPR\\$1\\)>\\)'\\. Supported form\\(s\\).*";
@@ -6154,7 +6154,7 @@ public class SqlValidatorTest extends
SqlValidatorTestCase {
.withConformance(strict).fails("Column 'DNO' not found in any table")
.withConformance(lenient).ok();
sql("select deptno as dno, ename name, sum(sal) from emp\n"
- + "group by grouping sets ((^dno^), (name, deptno))")
+ + "group by grouping sets (^(dno)^, (name, deptno))")
.withConformance(strict).fails("Column 'DNO' not found in any table")
.withConformance(lenient).ok();
sql("select ename as deptno from emp as e join dept as d on "
@@ -8283,7 +8283,7 @@ public class SqlValidatorTest extends
SqlValidatorTestCase {
@Test void testScalarSubQuery() {
sql("SELECT ename,(select name from dept where deptno=1) FROM emp").ok();
- sql("SELECT ename,(^select losal, hisal from salgrade where grade=1^) FROM
emp")
+ sql("SELECT ename,^(select losal, hisal from salgrade where grade=1)^ FROM
emp")
.fails("Cannot apply '\\$SCALAR_QUERY' to arguments of type "
+ "'\\$SCALAR_QUERY\\(<RECORDTYPE\\(INTEGER LOSAL, "
+ "INTEGER HISAL\\)>\\)'\\. Supported form\\(s\\): "
@@ -11515,7 +11515,7 @@ public class SqlValidatorTest extends
SqlValidatorTestCase {
sql("select (select ^slackingmin^ from emp_r), a from (select empno as a
from emp_r)")
.fails(error);
- sql("select (((^slackingmin^))) from emp_r")
+ sql("select ^(((slackingmin)))^ from emp_r")
.fails(error);
sql("select ^slackingmin^ from nest.emp_r")