[jira] [Commented] (CALCITE-2430) AssertionError: RelDataTypeImpl.getFieldList when SQL Advisor inspects non-struct field
[ https://issues.apache.org/jira/browse/CALCITE-2430?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16562716#comment-16562716 ] Julian Hyde commented on CALCITE-2430: -- By the way, I totally agree about advisor needing to be robust. It should not throw runtime exceptions (e.g. NPEs) even in the presence of invalid SQL. Given ill-formed or invalid SQL, it should endeavor to recover and produce useful suggestions. Also, given valid SQL, it should not (I won't say "must not") produce invalid suggestions. > AssertionError: RelDataTypeImpl.getFieldList when SQL Advisor inspects > non-struct field > --- > > Key: CALCITE-2430 > URL: https://issues.apache.org/jira/browse/CALCITE-2430 > Project: Calcite > Issue Type: Bug > Components: core >Affects Versions: 1.17.0 >Reporter: Vladimir Sitnikov >Assignee: Julian Hyde >Priority: Major > Fix For: 1.18.0 > > Attachments: fieldnamespace.png > > > Test case (in JdbcTest): > {code:java} @Test public void testSqlAdvisorNonStructColumn() > throws SQLException, ClassNotFoundException { > adviseSql("select e.\"empid\".^ from \"hr\".\"emps\" e", > CalciteAssert.checkResultUnordered( > "id=; names=null; type=MATCH", > "id=hr.dependents; names=[hr, dependents]; type=TABLE", > "id=hr.depts; names=[hr, depts]; type=TABLE", > "id=hr.emps; names=[hr, emps]; type=TABLE", > "id=hr.locations; names=[hr, locations]; type=TABLE", > "id=hr; names=[hr]; type=SCHEMA")); > }{code} > Relevant source from RelDataTypeImpl.getFieldList: > {code:java} public List getFieldList() { > assert isStruct(); // <-- Error here > return fieldList; > }{code} > Relevant source from SqlValidatorImpl.lookupNameCompletionHints: > {code:java} if (ns != null) { > RelDataType rowType = ns.getRowType(); > for (RelDataTypeField field : rowType.getFieldList()) { // <-- Error > here > hintList.add( > new SqlMonikerImpl( > field.getName(), > SqlMonikerType.COLUMN)); > } > }{code} > It looks like it makes sense to add {{isStruct}} check before iterating over > {{rowType.getFieldList()}}. > Any objections? > Original exception: {noformat} > java.lang.AssertionError > at > org.apache.calcite.rel.type.RelDataTypeImpl.getFieldList(RelDataTypeImpl.java:146) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupNameCompletionHints(SqlValidatorImpl.java:808) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupSelectHints(SqlValidatorImpl.java:690) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupSelectHints(SqlValidatorImpl.java:701) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupHints(SqlValidatorImpl.java:655) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints(SqlAdvisor.java:235) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints0(SqlAdvisor.java:182) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints(SqlAdvisor.java:142) > at > org.apache.calcite.sql.advise.SqlAdvisorGetHintsFunction.getCompletionHints(SqlAdvisorGetHintsFunction.java:105) > at Baz.bind(Unknown Source) > at > org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:356) > at > org.apache.calcite.jdbc.CalciteConnectionImpl.enumerable(CalciteConnectionImpl.java:309) > at > org.apache.calcite.jdbc.CalciteMetaImpl._createIterable(CalciteMetaImpl.java:506) > at > org.apache.calcite.jdbc.CalciteMetaImpl.createIterable(CalciteMetaImpl.java:497) > at > org.apache.calcite.avatica.AvaticaResultSet.execute(AvaticaResultSet.java:182) > at > org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:64) > at > org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:43) > at > org.apache.calcite.avatica.AvaticaConnection.executeQueryInternal(AvaticaConnection.java:573) > at > org.apache.calcite.avatica.AvaticaPreparedStatement.executeQuery(AvaticaPreparedStatement.java:137) > at org.apache.calcite.test.JdbcTest.adviseSql(JdbcTest.java:426) > at > org.apache.calcite.test.JdbcTest.testSqlAdvisorNonStructColumn(JdbcTest.java:359) > {noformat} -- This message was sent by Atlassian JIRA (v7.6.3#76005)
[jira] [Commented] (CALCITE-2430) AssertionError: RelDataTypeImpl.getFieldList when SQL Advisor inspects non-struct field
[ https://issues.apache.org/jira/browse/CALCITE-2430?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16562709#comment-16562709 ] Julian Hyde commented on CALCITE-2430: -- Yes, I think it's worth doing. Could you do it as a follow-up task? > AssertionError: RelDataTypeImpl.getFieldList when SQL Advisor inspects > non-struct field > --- > > Key: CALCITE-2430 > URL: https://issues.apache.org/jira/browse/CALCITE-2430 > Project: Calcite > Issue Type: Bug > Components: core >Affects Versions: 1.17.0 >Reporter: Vladimir Sitnikov >Assignee: Julian Hyde >Priority: Major > Fix For: 1.18.0 > > Attachments: fieldnamespace.png > > > Test case (in JdbcTest): > {code:java} @Test public void testSqlAdvisorNonStructColumn() > throws SQLException, ClassNotFoundException { > adviseSql("select e.\"empid\".^ from \"hr\".\"emps\" e", > CalciteAssert.checkResultUnordered( > "id=; names=null; type=MATCH", > "id=hr.dependents; names=[hr, dependents]; type=TABLE", > "id=hr.depts; names=[hr, depts]; type=TABLE", > "id=hr.emps; names=[hr, emps]; type=TABLE", > "id=hr.locations; names=[hr, locations]; type=TABLE", > "id=hr; names=[hr]; type=SCHEMA")); > }{code} > Relevant source from RelDataTypeImpl.getFieldList: > {code:java} public List getFieldList() { > assert isStruct(); // <-- Error here > return fieldList; > }{code} > Relevant source from SqlValidatorImpl.lookupNameCompletionHints: > {code:java} if (ns != null) { > RelDataType rowType = ns.getRowType(); > for (RelDataTypeField field : rowType.getFieldList()) { // <-- Error > here > hintList.add( > new SqlMonikerImpl( > field.getName(), > SqlMonikerType.COLUMN)); > } > }{code} > It looks like it makes sense to add {{isStruct}} check before iterating over > {{rowType.getFieldList()}}. > Any objections? > Original exception: {noformat} > java.lang.AssertionError > at > org.apache.calcite.rel.type.RelDataTypeImpl.getFieldList(RelDataTypeImpl.java:146) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupNameCompletionHints(SqlValidatorImpl.java:808) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupSelectHints(SqlValidatorImpl.java:690) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupSelectHints(SqlValidatorImpl.java:701) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupHints(SqlValidatorImpl.java:655) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints(SqlAdvisor.java:235) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints0(SqlAdvisor.java:182) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints(SqlAdvisor.java:142) > at > org.apache.calcite.sql.advise.SqlAdvisorGetHintsFunction.getCompletionHints(SqlAdvisorGetHintsFunction.java:105) > at Baz.bind(Unknown Source) > at > org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:356) > at > org.apache.calcite.jdbc.CalciteConnectionImpl.enumerable(CalciteConnectionImpl.java:309) > at > org.apache.calcite.jdbc.CalciteMetaImpl._createIterable(CalciteMetaImpl.java:506) > at > org.apache.calcite.jdbc.CalciteMetaImpl.createIterable(CalciteMetaImpl.java:497) > at > org.apache.calcite.avatica.AvaticaResultSet.execute(AvaticaResultSet.java:182) > at > org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:64) > at > org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:43) > at > org.apache.calcite.avatica.AvaticaConnection.executeQueryInternal(AvaticaConnection.java:573) > at > org.apache.calcite.avatica.AvaticaPreparedStatement.executeQuery(AvaticaPreparedStatement.java:137) > at org.apache.calcite.test.JdbcTest.adviseSql(JdbcTest.java:426) > at > org.apache.calcite.test.JdbcTest.testSqlAdvisorNonStructColumn(JdbcTest.java:359) > {noformat} -- This message was sent by Atlassian JIRA (v7.6.3#76005)
[jira] [Commented] (CALCITE-2430) AssertionError: RelDataTypeImpl.getFieldList when SQL Advisor inspects non-struct field
[ https://issues.apache.org/jira/browse/CALCITE-2430?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16562519#comment-16562519 ] Vladimir Sitnikov commented on CALCITE-2430: {quote}Yes, I know. But is there any point in having a namespace that is not a struct? I don't think so.{quote} That's a good question. {{org.apache.calcite.sql.validate.SqlValidatorScope.Resolve#namespace}} is used in quite a few places, so it might deserve its own ticket/code change. > AssertionError: RelDataTypeImpl.getFieldList when SQL Advisor inspects > non-struct field > --- > > Key: CALCITE-2430 > URL: https://issues.apache.org/jira/browse/CALCITE-2430 > Project: Calcite > Issue Type: Bug > Components: core >Affects Versions: 1.17.0 >Reporter: Vladimir Sitnikov >Assignee: Julian Hyde >Priority: Major > Fix For: 1.18.0 > > Attachments: fieldnamespace.png > > > Test case (in JdbcTest): > {code:java} @Test public void testSqlAdvisorNonStructColumn() > throws SQLException, ClassNotFoundException { > adviseSql("select e.\"empid\".^ from \"hr\".\"emps\" e", > CalciteAssert.checkResultUnordered( > "id=; names=null; type=MATCH", > "id=hr.dependents; names=[hr, dependents]; type=TABLE", > "id=hr.depts; names=[hr, depts]; type=TABLE", > "id=hr.emps; names=[hr, emps]; type=TABLE", > "id=hr.locations; names=[hr, locations]; type=TABLE", > "id=hr; names=[hr]; type=SCHEMA")); > }{code} > Relevant source from RelDataTypeImpl.getFieldList: > {code:java} public List getFieldList() { > assert isStruct(); // <-- Error here > return fieldList; > }{code} > Relevant source from SqlValidatorImpl.lookupNameCompletionHints: > {code:java} if (ns != null) { > RelDataType rowType = ns.getRowType(); > for (RelDataTypeField field : rowType.getFieldList()) { // <-- Error > here > hintList.add( > new SqlMonikerImpl( > field.getName(), > SqlMonikerType.COLUMN)); > } > }{code} > It looks like it makes sense to add {{isStruct}} check before iterating over > {{rowType.getFieldList()}}. > Any objections? > Original exception: {noformat} > java.lang.AssertionError > at > org.apache.calcite.rel.type.RelDataTypeImpl.getFieldList(RelDataTypeImpl.java:146) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupNameCompletionHints(SqlValidatorImpl.java:808) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupSelectHints(SqlValidatorImpl.java:690) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupSelectHints(SqlValidatorImpl.java:701) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupHints(SqlValidatorImpl.java:655) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints(SqlAdvisor.java:235) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints0(SqlAdvisor.java:182) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints(SqlAdvisor.java:142) > at > org.apache.calcite.sql.advise.SqlAdvisorGetHintsFunction.getCompletionHints(SqlAdvisorGetHintsFunction.java:105) > at Baz.bind(Unknown Source) > at > org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:356) > at > org.apache.calcite.jdbc.CalciteConnectionImpl.enumerable(CalciteConnectionImpl.java:309) > at > org.apache.calcite.jdbc.CalciteMetaImpl._createIterable(CalciteMetaImpl.java:506) > at > org.apache.calcite.jdbc.CalciteMetaImpl.createIterable(CalciteMetaImpl.java:497) > at > org.apache.calcite.avatica.AvaticaResultSet.execute(AvaticaResultSet.java:182) > at > org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:64) > at > org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:43) > at > org.apache.calcite.avatica.AvaticaConnection.executeQueryInternal(AvaticaConnection.java:573) > at > org.apache.calcite.avatica.AvaticaPreparedStatement.executeQuery(AvaticaPreparedStatement.java:137) > at org.apache.calcite.test.JdbcTest.adviseSql(JdbcTest.java:426) > at > org.apache.calcite.test.JdbcTest.testSqlAdvisorNonStructColumn(JdbcTest.java:359) > {noformat} -- This message was sent by Atlassian JIRA (v7.6.3#76005)
[jira] [Commented] (CALCITE-2430) AssertionError: RelDataTypeImpl.getFieldList when SQL Advisor inspects non-struct field
[ https://issues.apache.org/jira/browse/CALCITE-2430?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16562495#comment-16562495 ] Vladimir Sitnikov commented on CALCITE-2430: I think this is relevant: https://twitter.com/tagir_valeev/status/1011809520803295232 In other words, advisor has to deal with incomplete and invalid SQL, so it might naturally require more defensive checks than a regular code. > AssertionError: RelDataTypeImpl.getFieldList when SQL Advisor inspects > non-struct field > --- > > Key: CALCITE-2430 > URL: https://issues.apache.org/jira/browse/CALCITE-2430 > Project: Calcite > Issue Type: Bug > Components: core >Affects Versions: 1.17.0 >Reporter: Vladimir Sitnikov >Assignee: Julian Hyde >Priority: Major > Attachments: fieldnamespace.png > > > Test case (in JdbcTest): > {code:java} @Test public void testSqlAdvisorNonStructColumn() > throws SQLException, ClassNotFoundException { > adviseSql("select e.\"empid\".^ from \"hr\".\"emps\" e", > CalciteAssert.checkResultUnordered( > "id=; names=null; type=MATCH", > "id=hr.dependents; names=[hr, dependents]; type=TABLE", > "id=hr.depts; names=[hr, depts]; type=TABLE", > "id=hr.emps; names=[hr, emps]; type=TABLE", > "id=hr.locations; names=[hr, locations]; type=TABLE", > "id=hr; names=[hr]; type=SCHEMA")); > }{code} > Relevant source from RelDataTypeImpl.getFieldList: > {code:java} public List getFieldList() { > assert isStruct(); // <-- Error here > return fieldList; > }{code} > Relevant source from SqlValidatorImpl.lookupNameCompletionHints: > {code:java} if (ns != null) { > RelDataType rowType = ns.getRowType(); > for (RelDataTypeField field : rowType.getFieldList()) { // <-- Error > here > hintList.add( > new SqlMonikerImpl( > field.getName(), > SqlMonikerType.COLUMN)); > } > }{code} > It looks like it makes sense to add {{isStruct}} check before iterating over > {{rowType.getFieldList()}}. > Any objections? > Original exception: {noformat} > java.lang.AssertionError > at > org.apache.calcite.rel.type.RelDataTypeImpl.getFieldList(RelDataTypeImpl.java:146) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupNameCompletionHints(SqlValidatorImpl.java:808) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupSelectHints(SqlValidatorImpl.java:690) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupSelectHints(SqlValidatorImpl.java:701) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupHints(SqlValidatorImpl.java:655) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints(SqlAdvisor.java:235) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints0(SqlAdvisor.java:182) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints(SqlAdvisor.java:142) > at > org.apache.calcite.sql.advise.SqlAdvisorGetHintsFunction.getCompletionHints(SqlAdvisorGetHintsFunction.java:105) > at Baz.bind(Unknown Source) > at > org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:356) > at > org.apache.calcite.jdbc.CalciteConnectionImpl.enumerable(CalciteConnectionImpl.java:309) > at > org.apache.calcite.jdbc.CalciteMetaImpl._createIterable(CalciteMetaImpl.java:506) > at > org.apache.calcite.jdbc.CalciteMetaImpl.createIterable(CalciteMetaImpl.java:497) > at > org.apache.calcite.avatica.AvaticaResultSet.execute(AvaticaResultSet.java:182) > at > org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:64) > at > org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:43) > at > org.apache.calcite.avatica.AvaticaConnection.executeQueryInternal(AvaticaConnection.java:573) > at > org.apache.calcite.avatica.AvaticaPreparedStatement.executeQuery(AvaticaPreparedStatement.java:137) > at org.apache.calcite.test.JdbcTest.adviseSql(JdbcTest.java:426) > at > org.apache.calcite.test.JdbcTest.testSqlAdvisorNonStructColumn(JdbcTest.java:359) > {noformat} -- This message was sent by Atlassian JIRA (v7.6.3#76005)
[jira] [Commented] (CALCITE-2430) AssertionError: RelDataTypeImpl.getFieldList when SQL Advisor inspects non-struct field
[ https://issues.apache.org/jira/browse/CALCITE-2430?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16562486#comment-16562486 ] Vladimir Sitnikov commented on CALCITE-2430: Changing SqlValidatorImpl as follows: {code:java} SqlValidatorNamespace lookupFieldNamespace(RelDataType rowType, String name) { final SqlNameMatcher nameMatcher = catalogReader.nameMatcher(); final RelDataTypeField field = nameMatcher.field(rowType, name); if (field == null || !field.getType().isStruct()) { // <-- added isStruct here return null; } return new FieldNamespace(this, field.getType()); } {code} results in NPE like {noformat}Caused by: java.lang.NullPointerException at java.util.Objects.requireNonNull(Objects.java:203) at org.apache.calcite.sql.validate.SqlValidatorScope$Resolve.(SqlValidatorScope.java:329) at org.apache.calcite.sql.validate.SqlValidatorScope$ResolvedImpl.found(SqlValidatorScope.java:299) at org.apache.calcite.sql.validate.DelegatingScope.resolveInNamespace(DelegatingScope.java:98) at org.apache.calcite.sql.validate.DelegatingScope.resolveInNamespace(DelegatingScope.java:130) at org.apache.calcite.sql.validate.DelegatingScope.fullyQualify(DelegatingScope.java:403) at org.apache.calcite.sql.validate.SqlValidatorImpl.findTableColumnPair(SqlValidatorImpl.java:3427) at org.apache.calcite.sql.validate.SqlValidatorImpl.isRolledUpColumn(SqlValidatorImpl.java:3460) at org.apache.calcite.sql.validate.SqlValidatorImpl.expandStar(SqlValidatorImpl.java:513) at org.apache.calcite.sql.validate.SqlValidatorImpl.expandSelectItem(SqlValidatorImpl.java:422) at org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelectList(SqlValidatorImpl.java:4039) at org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:3302) at org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:60) at org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:84) at org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:972) at org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:948) at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:225) at org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:923) at org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:631) at org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:552) at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:264) at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:230) at org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:772) at org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:636) at org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:606) at org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:229) at org.apache.calcite.jdbc.CalciteConnectionImpl.prepareStatement_(CalciteConnectionImpl.java:211) {noformat} > AssertionError: RelDataTypeImpl.getFieldList when SQL Advisor inspects > non-struct field > --- > > Key: CALCITE-2430 > URL: https://issues.apache.org/jira/browse/CALCITE-2430 > Project: Calcite > Issue Type: Bug > Components: core >Affects Versions: 1.17.0 >Reporter: Vladimir Sitnikov >Assignee: Julian Hyde >Priority: Major > Attachments: fieldnamespace.png > > > Test case (in JdbcTest): > {code:java} @Test public void testSqlAdvisorNonStructColumn() > throws SQLException, ClassNotFoundException { > adviseSql("select e.\"empid\".^ from \"hr\".\"emps\" e", > CalciteAssert.checkResultUnordered( > "id=; names=null; type=MATCH", > "id=hr.dependents; names=[hr, dependents]; type=TABLE", > "id=hr.depts; names=[hr, depts]; type=TABLE", > "id=hr.emps; names=[hr, emps]; type=TABLE", > "id=hr.locations; names=[hr, locations]; type=TABLE", > "id=hr; names=[hr]; type=SCHEMA")); > }{code} > Relevant source from RelDataTypeImpl.getFieldList: > {code:java} public List getFieldList() { > assert isStruct(); // <-- Error here > return fieldList; > }{code} > Relevant source from SqlValidatorImpl.lookupNameCompletionHints: > {code:java} if (ns != null) { > RelDataType rowType = ns.getRowType(); > for (RelDataTypeField field : rowType.getFieldList()) {
[jira] [Commented] (CALCITE-2430) AssertionError: RelDataTypeImpl.getFieldList when SQL Advisor inspects non-struct field
[ https://issues.apache.org/jira/browse/CALCITE-2430?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16562484#comment-16562484 ] Julian Hyde commented on CALCITE-2430: -- Yes, I know. But is there any point in having a namespace that is not a struct? I don't think so. > AssertionError: RelDataTypeImpl.getFieldList when SQL Advisor inspects > non-struct field > --- > > Key: CALCITE-2430 > URL: https://issues.apache.org/jira/browse/CALCITE-2430 > Project: Calcite > Issue Type: Bug > Components: core >Affects Versions: 1.17.0 >Reporter: Vladimir Sitnikov >Assignee: Julian Hyde >Priority: Major > Attachments: fieldnamespace.png > > > Test case (in JdbcTest): > {code:java} @Test public void testSqlAdvisorNonStructColumn() > throws SQLException, ClassNotFoundException { > adviseSql("select e.\"empid\".^ from \"hr\".\"emps\" e", > CalciteAssert.checkResultUnordered( > "id=; names=null; type=MATCH", > "id=hr.dependents; names=[hr, dependents]; type=TABLE", > "id=hr.depts; names=[hr, depts]; type=TABLE", > "id=hr.emps; names=[hr, emps]; type=TABLE", > "id=hr.locations; names=[hr, locations]; type=TABLE", > "id=hr; names=[hr]; type=SCHEMA")); > }{code} > Relevant source from RelDataTypeImpl.getFieldList: > {code:java} public List getFieldList() { > assert isStruct(); // <-- Error here > return fieldList; > }{code} > Relevant source from SqlValidatorImpl.lookupNameCompletionHints: > {code:java} if (ns != null) { > RelDataType rowType = ns.getRowType(); > for (RelDataTypeField field : rowType.getFieldList()) { // <-- Error > here > hintList.add( > new SqlMonikerImpl( > field.getName(), > SqlMonikerType.COLUMN)); > } > }{code} > It looks like it makes sense to add {{isStruct}} check before iterating over > {{rowType.getFieldList()}}. > Any objections? > Original exception: {noformat} > java.lang.AssertionError > at > org.apache.calcite.rel.type.RelDataTypeImpl.getFieldList(RelDataTypeImpl.java:146) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupNameCompletionHints(SqlValidatorImpl.java:808) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupSelectHints(SqlValidatorImpl.java:690) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupSelectHints(SqlValidatorImpl.java:701) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupHints(SqlValidatorImpl.java:655) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints(SqlAdvisor.java:235) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints0(SqlAdvisor.java:182) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints(SqlAdvisor.java:142) > at > org.apache.calcite.sql.advise.SqlAdvisorGetHintsFunction.getCompletionHints(SqlAdvisorGetHintsFunction.java:105) > at Baz.bind(Unknown Source) > at > org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:356) > at > org.apache.calcite.jdbc.CalciteConnectionImpl.enumerable(CalciteConnectionImpl.java:309) > at > org.apache.calcite.jdbc.CalciteMetaImpl._createIterable(CalciteMetaImpl.java:506) > at > org.apache.calcite.jdbc.CalciteMetaImpl.createIterable(CalciteMetaImpl.java:497) > at > org.apache.calcite.avatica.AvaticaResultSet.execute(AvaticaResultSet.java:182) > at > org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:64) > at > org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:43) > at > org.apache.calcite.avatica.AvaticaConnection.executeQueryInternal(AvaticaConnection.java:573) > at > org.apache.calcite.avatica.AvaticaPreparedStatement.executeQuery(AvaticaPreparedStatement.java:137) > at org.apache.calcite.test.JdbcTest.adviseSql(JdbcTest.java:426) > at > org.apache.calcite.test.JdbcTest.testSqlAdvisorNonStructColumn(JdbcTest.java:359) > {noformat} -- This message was sent by Atlassian JIRA (v7.6.3#76005)
[jira] [Commented] (CALCITE-2430) AssertionError: RelDataTypeImpl.getFieldList when SQL Advisor inspects non-struct field
[ https://issues.apache.org/jira/browse/CALCITE-2430?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16562440#comment-16562440 ] Julian Hyde commented on CALCITE-2430: -- bq. It looks like it makes sense to add {{isStruct}} check before iterating over {{rowType.getFieldList()}}. Probably. But we should look into the other possibility: only create a {{FieldNamespace}} if the field is a struct, and in fact assert that any namespace can only be based on a struct (record) type. > AssertionError: RelDataTypeImpl.getFieldList when SQL Advisor inspects > non-struct field > --- > > Key: CALCITE-2430 > URL: https://issues.apache.org/jira/browse/CALCITE-2430 > Project: Calcite > Issue Type: Bug > Components: core >Affects Versions: 1.17.0 >Reporter: Vladimir Sitnikov >Assignee: Julian Hyde >Priority: Major > > Test case (in JdbcTest): > {code:java} @Test public void testSqlAdvisorNonStructColumn() > throws SQLException, ClassNotFoundException { > adviseSql("select e.\"empid\".^ from \"hr\".\"emps\" e", > CalciteAssert.checkResultUnordered( > "id=; names=null; type=MATCH", > "id=hr.dependents; names=[hr, dependents]; type=TABLE", > "id=hr.depts; names=[hr, depts]; type=TABLE", > "id=hr.emps; names=[hr, emps]; type=TABLE", > "id=hr.locations; names=[hr, locations]; type=TABLE", > "id=hr; names=[hr]; type=SCHEMA")); > }{code} > Relevant source from RelDataTypeImpl.getFieldList: > {code:java} public List getFieldList() { > assert isStruct(); // <-- Error here > return fieldList; > }{code} > Relevant source from SqlValidatorImpl.lookupNameCompletionHints: > {code:java} if (ns != null) { > RelDataType rowType = ns.getRowType(); > for (RelDataTypeField field : rowType.getFieldList()) { // <-- Error > here > hintList.add( > new SqlMonikerImpl( > field.getName(), > SqlMonikerType.COLUMN)); > } > }{code} > It looks like it makes sense to add {{isStruct}} check before iterating over > {{rowType.getFieldList()}}. > Any objections? > Original exception: {noformat} > java.lang.AssertionError > at > org.apache.calcite.rel.type.RelDataTypeImpl.getFieldList(RelDataTypeImpl.java:146) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupNameCompletionHints(SqlValidatorImpl.java:808) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupSelectHints(SqlValidatorImpl.java:690) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupSelectHints(SqlValidatorImpl.java:701) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.lookupHints(SqlValidatorImpl.java:655) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints(SqlAdvisor.java:235) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints0(SqlAdvisor.java:182) > at > org.apache.calcite.sql.advise.SqlAdvisor.getCompletionHints(SqlAdvisor.java:142) > at > org.apache.calcite.sql.advise.SqlAdvisorGetHintsFunction.getCompletionHints(SqlAdvisorGetHintsFunction.java:105) > at Baz.bind(Unknown Source) > at > org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:356) > at > org.apache.calcite.jdbc.CalciteConnectionImpl.enumerable(CalciteConnectionImpl.java:309) > at > org.apache.calcite.jdbc.CalciteMetaImpl._createIterable(CalciteMetaImpl.java:506) > at > org.apache.calcite.jdbc.CalciteMetaImpl.createIterable(CalciteMetaImpl.java:497) > at > org.apache.calcite.avatica.AvaticaResultSet.execute(AvaticaResultSet.java:182) > at > org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:64) > at > org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:43) > at > org.apache.calcite.avatica.AvaticaConnection.executeQueryInternal(AvaticaConnection.java:573) > at > org.apache.calcite.avatica.AvaticaPreparedStatement.executeQuery(AvaticaPreparedStatement.java:137) > at org.apache.calcite.test.JdbcTest.adviseSql(JdbcTest.java:426) > at > org.apache.calcite.test.JdbcTest.testSqlAdvisorNonStructColumn(JdbcTest.java:359) > {noformat} -- This message was sent by Atlassian JIRA (v7.6.3#76005)