[
https://issues.apache.org/jira/browse/CALCITE-4695?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17383077#comment-17383077
]
jhkcool edited comment on CALCITE-4695 at 7/19/21, 7:41 AM:
------------------------------------------------------------
ok. but comment seems cannot to be formated. My goal is to turn SQL's rewritten
relNode back into SQL after performing rule optimization via calcite.
1. the first test sql from JdbcTest.testJdbcDate(), you can find in class
JdbcTest.java.
{code:java}
@Test void testJdbcDate() {
CalciteAssert.that()
.with(CalciteAssert.Config.FOODMART_CLONE)
.query("select count(*) as c from (\n"
+ " select 1 from \"foodmart\".\"employee\" as e1\n"
+ " where \"position_title\" = 'VP Country Manager'\n"
+ " and \"birth_date\" < DATE '1950-01-01'\n"
+ " and \"gender\" = 'F')")
.enable(CalciteAssert.DB != CalciteAssert.DatabaseInstance.ORACLE)
.returns2("C=1\n");
}{code}
When it executes to optimize in class Prepare, it gets the SQL rewritten
relNode, I convert relNode to SQL, but error occur.
{code:java}
// code placeholder
root = optimize(root, getMaterializations(), getLattices());
final RelToSqlConverter converter = new
RelToSqlConverter(CalciteSqlDialect.DEFAULT);
SqlImplementor.Result result = converter.visitRoot(root.rel);
final SqlNode sqlNode = result.asStatement();
final String sql = sqlNode.toSqlString(CalciteSqlDialect.DEFAULT).getSql();
{code}
2. the second test sql from
JdbcTest.testExplainAllAttributesSemiJoinUnionCorrelate()
{code:java}
// code placeholder
@Test void testExplainAllAttributesSemiJoinUnionCorrelate() {
final String sql = "select deptno, name from depts where deptno in (\n"
+ " select e.deptno from emps e where exists (\n"
+ " select 1 from depts d where d.deptno = e.deptno)\n"
+ " union\n"
+ " select e.deptno from emps e where e.salary > 10000)";
CalciteAssert.that()
.with(CalciteConnectionProperty.LEX, Lex.JAVA)
.with(CalciteConnectionProperty.FORCE_DECORRELATE, false)
.withSchema("s", new ReflectiveSchema(new JdbcTest.HrSchema()))
.query(sql).returns("");
}
{code}
was (Author: jhkcool):
ok. but comment seems cannot to be formated. My goal is to turn SQL's rewritten
relNode back into SQL after performing rule optimization via calcite.
1. the first test sql from JdbcTest.testJdbcDate(), you can find in class
JdbcTest.java.
{code:java}
@Test void testJdbcDate() {
CalciteAssert.that()
.with(CalciteAssert.Config.FOODMART_CLONE)
.query("select count(*) as c from (\n"
+ " select 1 from \"foodmart\".\"employee\" as e1\n"
+ " where \"position_title\" = 'VP Country Manager'\n"
+ " and \"birth_date\" < DATE '1950-01-01'\n"
+ " and \"gender\" = 'F')")
.enable(CalciteAssert.DB != CalciteAssert.DatabaseInstance.ORACLE)
.returns2("C=1\n");
}{code}
When it executes to optimize in class Prepare, it gets the SQL rewritten
relNode, I convert relNode to SQL, but error occur.
{code:java}
// code placeholder
final RelToSqlConverter converter = new
RelToSqlConverter(CalciteSqlDialect.DEFAULT); SqlImplementor.Result result =
converter.visitRoot(root.rel); final SqlNode sqlNode = result.asStatement();
final String sql = sqlNode.toSqlString(CalciteSqlDialect.DEFAULT).getSql();
{code}
2. the second test sql from
JdbcTest.testExplainAllAttributesSemiJoinUnionCorrelate()
{code:java}
// code placeholder
@Test void testExplainAllAttributesSemiJoinUnionCorrelate() {
final String sql = "select deptno, name from depts where deptno in (\n"
+ " select e.deptno from emps e where exists (\n"
+ " select 1 from depts d where d.deptno = e.deptno)\n"
+ " union\n"
+ " select e.deptno from emps e where e.salary > 10000)";
CalciteAssert.that()
.with(CalciteConnectionProperty.LEX, Lex.JAVA)
.with(CalciteConnectionProperty.FORCE_DECORRELATE, false)
.withSchema("s", new ReflectiveSchema(new JdbcTest.HrSchema()))
.query(sql).returns("");
}
{code}
> The method of RelToSqlConverter.visit(Join e) throw NullPointerException
> ------------------------------------------------------------------------
>
> Key: CALCITE-4695
> URL: https://issues.apache.org/jira/browse/CALCITE-4695
> Project: Calcite
> Issue Type: Bug
> Components: core
> Affects Versions: 1.27.0
> Environment: centos: Win10
> JDK: hostspot 1.8.0_291
> Reporter: jhkcool
> Assignee: duan xiong
> Priority: Major
> Labels: pull-request-available
> Attachments: 截屏2021-07-19 15.30.31.png
>
> Time Spent: 10m
> Remaining Estimate: 0h
>
> test sql:
> {code:java}
> select *
> from "sales_fact_1997" as s
> join "customer" as c
> on s."customer_id" = c."customer_id"
> join "product" as p
> on s."product_id" = p."product_id"
> where c."city" = 'San Francisco'
> and p."brand_name" = 'Washington'{code}
> (from JdbcTest.testAlmostBushy())
> when I try to convert relnode to sql, throw NullPointerException, the code is
> as follows:
> {quote}{{RelToSqlConverter relToSqlConverter = new
> RelToSqlConverter(SqlDialect.DatabaseProduct.CALCITE.getDialect());}}
> SqlImplementor.Result joinResult =
> relToSqlConverter.visit((EnumerableMergeJoin)rootRel4);{quote}
>
> And NullPointerException stackTrace is as follows:
>
> {code:java}
> 0 = {StackTraceElement@7031}
> "java.util.Objects.requireNonNull(Objects.java:203)"
> 1 = {StackTraceElement@7032}
> "org.apache.calcite.rel.rel2sql.RelToSqlConverter.result(RelToSqlConverter.java:160)"
> 2 = {StackTraceElement@7033}
> "org.apache.calcite.rel.rel2sql.SqlImplementor.result(SqlImplementor.java:453)"
> 3 = {StackTraceElement@7034}
> "org.apache.calcite.rel.rel2sql.RelToSqlConverter.visit(RelToSqlConverter.java:239)"
> 4 = {StackTraceElement@7035}
> "org.apache.calcite.prepare.Prepare.optimize(Prepare.java:179)"
> 5 = {StackTraceElement@7036}
> "org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:300)"
> 6 = {StackTraceElement@7037}
> "org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:215)"
> 7 = {StackTraceElement@7038}
> "org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:647)"
> 8 = {StackTraceElement@7039}
> "org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:513)"
> 9 = {StackTraceElement@7040}
> "org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:483)"
> 10 = {StackTraceElement@7041}
> "org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:249)"
> 11 = {StackTraceElement@7042}
> "org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:623)"
> 12 = {StackTraceElement@7043}
> "org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:675)"
> 13 = {StackTraceElement@7044}
> "org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:156)"
> 14 = {StackTraceElement@7045}
> "org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:227)"
> 15 = {StackTraceElement@7046}
> "org.apache.calcite.test.CalciteAssert.assertQuery(CalciteAssert.java:535)"
> 16 = {StackTraceElement@7047}
> "org.apache.calcite.test.CalciteAssert$AssertQuery.lambda$returns$1(CalciteAssert.java:1547)"
> 17 = {StackTraceElement@7048}
> "org.apache.calcite.test.CalciteAssert$AssertQuery.withConnection(CalciteAssert.java:1486)"
> 18 = {StackTraceElement@7049}
> "org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1545)"
> 19 = {StackTraceElement@7050}
> "org.apache.calcite.test.CalciteAssert$AssertQuery.explainMatches(CalciteAssert.java:1739)"
> 20 = {StackTraceElement@7051}
> "org.apache.calcite.test.JdbcTest.testAlmostBushy(JdbcTest.java:1179)"
> 21 = {StackTraceElement@7052}
> "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)"
> 22 = {StackTraceElement@7053}
> "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)"
> 23 = {StackTraceElement@7054}
> "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)"
> 24 = {StackTraceElement@7055}
> "java.lang.reflect.Method.invoke(Method.java:498)"
> 25 = {StackTraceElement@7056}
> "org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:675)"
> 26 = {StackTraceElement@7057}
> "org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)"
> 27 = {StackTraceElement@7058}
> "org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:125)"
> 28 = {StackTraceElement@7059}
> "org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:139)"
> 29 = {StackTraceElement@7060}
> "org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:131)"
> 30 = {StackTraceElement@7061}
> "org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:81)"
> 31 = {StackTraceElement@7062}
> "org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)"
> 32 = {StackTraceElement@7063}
> "org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)"
> 33 = {StackTraceElement@7064}
> "org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:104)"
> 34 = {StackTraceElement@7065}
> "org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:62)"
> 35 = {StackTraceElement@7066}
> "org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:43)"
> 36 = {StackTraceElement@7067}
> "org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:35)"
> 37 = {StackTraceElement@7068}
> "org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)"
> 38 = {StackTraceElement@7069}
> "org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)"
> 39 = {StackTraceElement@7070}
> "org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:202)"
> 40 = {StackTraceElement@7071}
> "org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)"
> 41 = {StackTraceElement@7072}
> "org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:198)"
> 42 = {StackTraceElement@7073}
> "org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)"
> 43 = {StackTraceElement@7074}
> "org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)"
> 44 = {StackTraceElement@7075}
> "org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)"
> 45 = {StackTraceElement@7076}
> "org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)"
> 46 = {StackTraceElement@7077}
> "org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)"
> 47 = {StackTraceElement@7078}
> "org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)"
> 48 = {StackTraceElement@7079}
> "org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)"
> 49 = {StackTraceElement@7080}
> "org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)"
> 50 = {StackTraceElement@7081}
> "org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)"
> 51 = {StackTraceElement@7082}
> "org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)"
> 52 = {StackTraceElement@7083}
> "java.util.ArrayList.forEach(ArrayList.java:1259)"
> 53 = {StackTraceElement@7084}
> "org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)"
> 54 = {StackTraceElement@7085}
> "org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)"
> 55 = {StackTraceElement@7086}
> "org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)"
> 56 = {StackTraceElement@7087}
> "org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)"
> 57 = {StackTraceElement@7088}
> "org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)"
> 58 = {StackTraceElement@7089}
> "org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)"
> 59 = {StackTraceElement@7090}
> "org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)"
> 60 = {StackTraceElement@7091}
> "org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)"
> 61 = {StackTraceElement@7092}
> "org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)"
> 62 = {StackTraceElement@7093}
> "java.util.ArrayList.forEach(ArrayList.java:1259)"
> 63 = {StackTraceElement@7094}
> "org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)"
> 64 = {StackTraceElement@7095}
> "org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)"
> 65 = {StackTraceElement@7096}
> "org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)"
> 66 = {StackTraceElement@7097}
> "org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)"
> 67 = {StackTraceElement@7098}
> "org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)"
> 68 = {StackTraceElement@7099}
> "org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)"
> 69 = {StackTraceElement@7100}
> "org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)"
> 70 = {StackTraceElement@7101}
> "org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)"
> 71 = {StackTraceElement@7102}
> "org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)"
> 72 = {StackTraceElement@7103}
> "org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)"
> 73 = {StackTraceElement@7104}
> "org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)"
> 74 = {StackTraceElement@7105}
> "org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)"
> 75 = {StackTraceElement@7106}
> "org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248)"
> 76 = {StackTraceElement@7107}
> "org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211)"
> 77 = {StackTraceElement@7108}
> "org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)"
> 78 = {StackTraceElement@7109}
> "org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)"
> 79 = {StackTraceElement@7110}
> "org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132)"
> 80 = {StackTraceElement@7111}
> "com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)"
> 81 = {StackTraceElement@7112}
> "com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)"
> 82 = {StackTraceElement@7113}
> "com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)"
> 83 = {StackTraceElement@7114}
> "com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)"
>
> {code}
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)