[ 
https://issues.apache.org/jira/browse/DERBY-4753?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Knut Anders Hatlen updated DERBY-4753:
--------------------------------------

    Attachment: Derby4753.java

As suggested above, newer versions accept the FALSE keyword also in 
non-internal queries. However, the getIndexInfo query uses other internal 
syntax, so this may still fail, just with a different syntax error.

I noticed that the stack trace contained a call to 
GenericPreparedStatement.rePrepare(), so it looks like it happened after 
getIndexInfo() found out it was using a stale query plan and decided to 
recompile. When recompilation is invoked through that path, it ends up calling 
GenericStatement.prepare() with the forMetaData parameter set to false. This is 
the reason why the internal syntax isn't accepted.

Following that clue, I managed to reproduce the syntax error, but only when 
running in soft-upgrade mode. Presumably, soft-upgrade mode is needed because 
the call to rePrepare() in GenericPreparedStatement.executeStmt() is guarded 
with a check for whether it is an SPS, and the SPS is not used in soft-upgrade.

The error can be reproduced by following these steps:

1) Create an empty database using Derby 10.9.1.0:

$ java -jar 10.9.1.0/derbyrun.jar ij
ij version 10.9
ij> connect 'jdbc:derby:db;create=true';
ij> exit;

2) Using the Derby development trunk, run the attached Derby4753.java program 
with the properties derby.language.stalePlanCheckInterval=5 and 
derby.database.allowPreReleaseUpgrade=true:

$ java -Dderby.language.stalePlanCheckInterval=5 
-Dderby.database.allowPreReleaseUpgrade=true Derby4753
Exception in thread "main" java.sql.SQLSyntaxErrorException: Syntax error: 
org.apache.derby.catalog.IndexDescriptor.isUnique.
        at 
org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:92)
        at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Util.java:256)
        at 
org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:424)
        at 
org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(TransactionResourceImpl.java:353)
        at 
org.apache.derby.impl.jdbc.EmbedConnection.handleException(EmbedConnection.java:2400)
        at 
org.apache.derby.impl.jdbc.ConnectionChild.handleException(ConnectionChild.java:82)
        at 
org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1334)
        at 
org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(EmbedPreparedStatement.java:1715)
        at 
org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeQuery(EmbedPreparedStatement.java:287)
        at 
org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.doGetIndexInfo(EmbedDatabaseMetaData.java:2830)
        at 
org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.getIndexInfo(EmbedDatabaseMetaData.java:2790)
        at Derby4753.checkIndexInfo(Derby4753.java:43)
        at Derby4753.main(Derby4753.java:26)
Caused by: java.sql.SQLException: Syntax error: 
org.apache.derby.catalog.IndexDescriptor.isUnique.
        at 
org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:42)
        at 
org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(SQLExceptionFactory40.java:122)
        at 
org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:71)
        ... 12 more
Caused by: ERROR 42X01: Syntax error: 
org.apache.derby.catalog.IndexDescriptor.isUnique.
        at 
org.apache.derby.iapi.error.StandardException.newException(StandardException.java:278)
        at 
org.apache.derby.impl.sql.compile.MethodCallNode.resolveMethodCall(MethodCallNode.java:784)
        at 
org.apache.derby.impl.sql.compile.NonStaticMethodCallNode.bindExpression(NonStaticMethodCallNode.java:186)
        at 
org.apache.derby.impl.sql.compile.JavaToSQLValueNode.bindExpression(JavaToSQLValueNode.java:237)
        at 
org.apache.derby.impl.sql.compile.ConditionalNode.bindExpression(ConditionalNode.java:388)
        at 
org.apache.derby.impl.sql.compile.ResultColumn.bindExpression(ResultColumn.java:737)
        at 
org.apache.derby.impl.sql.compile.ResultColumnList.bindExpressions(ResultColumnList.java:831)
        at 
org.apache.derby.impl.sql.compile.SelectNode.bindExpressions(SelectNode.java:580)
        at 
org.apache.derby.impl.sql.compile.DMLStatementNode.bindExpressions(DMLStatementNode.java:227)
        at 
org.apache.derby.impl.sql.compile.DMLStatementNode.bind(DMLStatementNode.java:140)
        at 
org.apache.derby.impl.sql.compile.CursorNode.bindStatement(CursorNode.java:267)
        at 
org.apache.derby.impl.sql.GenericStatement.prepMinion(GenericStatement.java:400)
        at 
org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.java:99)
        at 
org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.java:85)
        at 
org.apache.derby.impl.sql.GenericPreparedStatement.rePrepare(GenericPreparedStatement.java:245)
        at 
org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(GenericPreparedStatement.java:425)
        at 
org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java:333)
        at 
org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1242)
        ... 6 more

The repro works like this:

It invokes getIndexInfo() once so that the query is compiled. Then it creates a 
table with lots of columns, so that SYS.SYSCOLUMNS grows significantly. Then it 
re-executes getIndexInfo() a number of times. After the fifth execution 
(because derby.language.stalePlanCheckInterval=5) it checks if the query plan 
is stale. It discovers that SYS.SYSCOLUMNS has changed in size since the 
initial compilation, and decides the query needs to be recompiled. When 
re-compiling, it goes down the code path where internal syntax is not allowed.
                
> "ERROR 42X01: Syntax error: FALSE." during call to 
> java.sql.DatabaseMetaData.getIndexInfo
> -----------------------------------------------------------------------------------------
>
>                 Key: DERBY-4753
>                 URL: https://issues.apache.org/jira/browse/DERBY-4753
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.5.3.0
>         Environment: Linux
>            Reporter: Craig Chaney
>              Labels: derby_triage10_8
>         Attachments: Derby4753.java
>
>
> We are seeing the failure below occasionally.  It does not happen every time 
> ... with the exact same database and call sequence it will happen about 1 out 
> of 3 times.
> The parameters on the getIndexInfo call are
> connection.getMetaData().getIndexInfo(null, schemaName, tableName, false, 
> false);
> schemaName and tableName are valid and definitely not null.
> Caused by: 
> java.sql.SQLException: Syntax error: FALSE.
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
>       at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown 
> Source)
>       at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown 
> Source)
>       at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown 
> Source)
>       at 
> org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(Unknown 
> Source)
>       at 
> org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeQuery(Unknown Source)
>       at 
> org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.doGetIndexInfo(Unknown 
> Source)
>       at 
> org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.getIndexInfo(Unknown Source)
>       at 
> com.ibm.team.repository.service.db.provider.AbstractDbProvider.getIndexMetadata(AbstractDbProvider.java:381)
>       at 
> com.ibm.team.repository.service.db.provider.AbstractDbProvider.doesIndexExist(AbstractDbProvider.java:343)
>       ... 61 more
> Caused by: 
> ERROR 42X01: Syntax error: FALSE.
>       at org.apache.derby.iapi.error.StandardException.newException(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.checkInternalFeature(Unknown 
> Source)
>       at org.apache.derby.impl.sql.compile.SQLParser.literal(Unknown Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.valueSpecification(Unknown Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.valueExpressionPrimary(Unknown 
> Source)
>       at org.apache.derby.impl.sql.compile.SQLParser.primary(Unknown Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.primaryExpressionXX(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.primaryExpression(Unknown Source)
>       at org.apache.derby.impl.sql.compile.SQLParser.unaryExpression(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.multiplicativeExpression(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.additiveExpression(Unknown Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.thenElseExpression(Unknown Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.whenThenExpression(Unknown Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.valueSpecification(Unknown Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.valueExpressionPrimary(Unknown 
> Source)
>       at org.apache.derby.impl.sql.compile.SQLParser.primary(Unknown Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.primaryExpressionXX(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.primaryExpression(Unknown Source)
>       at org.apache.derby.impl.sql.compile.SQLParser.unaryExpression(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.multiplicativeExpression(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.additiveExpression(Unknown Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.valueExpressionPrimary(Unknown 
> Source)
>       at org.apache.derby.impl.sql.compile.SQLParser.primary(Unknown Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.primaryExpressionXX(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.primaryExpression(Unknown Source)
>       at org.apache.derby.impl.sql.compile.SQLParser.unaryExpression(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.multiplicativeExpression(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.additiveExpression(Unknown Source)
>       at org.apache.derby.impl.sql.compile.SQLParser.derivedColumn(Unknown 
> Source)
>       at org.apache.derby.impl.sql.compile.SQLParser.selectSublist(Unknown 
> Source)
>       at org.apache.derby.impl.sql.compile.SQLParser.selectColumnList(Unknown 
> Source)
>       at org.apache.derby.impl.sql.compile.SQLParser.selectList(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.querySpecification(Unknown Source)
>       at org.apache.derby.impl.sql.compile.SQLParser.simpleTable(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.nonJoinQueryPrimary(Unknown 
> Source)
>       at org.apache.derby.impl.sql.compile.SQLParser.nonJoinQueryTerm(Unknown 
> Source)
>       at org.apache.derby.impl.sql.compile.SQLParser.queryExpression(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.preparableSelectStatement(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.compile.SQLParser.preparableSQLDataStatement(Unknown
>  Source)
>       at org.apache.derby.impl.sql.compile.SQLParser.StatementPart(Unknown 
> Source)
>       at org.apache.derby.impl.sql.compile.SQLParser.Statement(Unknown Source)
>       at org.apache.derby.impl.sql.compile.ParserImpl.parseStatement(Unknown 
> Source)
>       at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
>       at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source)
>       at org.apache.derby.impl.sql.GenericPreparedStatement.rePrepare(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown Source)
>       at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown 
> Source)
>       ... 68 more

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to