Skip to content

MySQL mode show columns from table, if modificationMetaId changed between prepared and execute. Then error eccored. #3698

@tuichenchuxin

Description

@tuichenchuxin

I found these code in Prepared

    public boolean needRecompile() {
        Database db = session.getDatabase();
        if (db == null) {
            throw DbException.get(ErrorCode.CONNECTION_BROKEN_1, "database closed");
        }
        // parser: currently, compiling every create/drop/... twice
        // because needRecompile return true even for the first execution
        return prepareAlways ||
                modificationMetaId < db.getModificationMetaId() ||
                db.getSettings().recompileAlways;
    }

if modificationMetaId changed between prepared and execute.
show columns from table will change to

SELECT C.COLUMN_NAME                                    FIELD,
       DATA_TYPE_SQL(?2, ?1, 'TABLE', C.DTD_IDENTIFIER) TYPE,
       C.IS_NULLABLE                                    "NULL",
       CASE (SELECT MAX(I.INDEX_TYPE_NAME)
             FROM INFORMATION_SCHEMA.INDEXES I
                      JOIN INFORMATION_SCHEMA.INDEX_COLUMNS IC
             WHERE I.TABLE_SCHEMA = C.TABLE_SCHEMA
               AND I.TABLE_NAME = C.TABLE_NAME
               AND IC.TABLE_SCHEMA = C.TABLE_SCHEMA
               AND IC.TABLE_NAME = C.TABLE_NAME
               AND IC.INDEX_SCHEMA = I.INDEX_SCHEMA
               AND IC.INDEX_NAME = I.INDEX_NAME
               AND IC.COLUMN_NAME = C.COLUMN_NAME)
           WHEN 'PRIMARY KEY' THEN 'PRI'
           WHEN 'UNIQUE INDEX' THEN 'UNI'
           ELSE '' END                                  `KEY`,
       COALESCE(COLUMN_DEFAULT, 'NULL')                 `DEFAULT`
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE C.TABLE_NAME = ?1
  AND C.TABLE_SCHEMA = ?2
ORDER BY C.ORDINAL_POSITION

but recompile has no parameters. Then errors occured like this.

Caused by: java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
 at java.util.ArrayList.rangeCheck(ArrayList.java:659)
 at java.util.ArrayList.get(ArrayList.java:435)
 at org.h2.command.Parser.readParameter(Parser.java:4877)
 at org.h2.command.Parser.readTermWithoutIdentifier(Parser.java:4950)
 at org.h2.command.Parser.readTerm(Parser.java:4901)
 at org.h2.command.Parser.readFactor(Parser.java:3398)
 at org.h2.command.Parser.readSum(Parser.java:3385)
 at org.h2.command.Parser.readConcat(Parser.java:3350)
 at org.h2.command.Parser.readCondition(Parser.java:3132)
 at org.h2.command.Parser.readExpression(Parser.java:3053)
 at org.h2.command.Parser.readBuiltinFunctionIf(Parser.java:4391)
 at org.h2.command.Parser.readFunction(Parser.java:3829)
 at org.h2.command.Parser.readTermWithIdentifier(Parser.java:5211)
 at org.h2.command.Parser.readTerm(Parser.java:4901)
 at org.h2.command.Parser.readFactor(Parser.java:3398)
 at org.h2.command.Parser.readSum(Parser.java:3385)
 at org.h2.command.Parser.readConcat(Parser.java:3350)
 at org.h2.command.Parser.readCondition(Parser.java:3132)
 at org.h2.command.Parser.readExpression(Parser.java:3053)
 at org.h2.command.Parser.parseSelectExpressions(Parser.java:2853)
 at org.h2.command.Parser.parseSelect(Parser.java:2871)
 at org.h2.command.Parser.parseQueryPrimary(Parser.java:2762)
 at org.h2.command.Parser.parseQueryTerm(Parser.java:2633)
 at org.h2.command.Parser.parseQueryExpressionBody(Parser.java:2612)
 at org.h2.command.Parser.parseQueryExpressionBodyAndEndOfQuery(Parser.java:2605)
 at org.h2.command.Parser.parseQueryExpression(Parser.java:2598)
 at org.h2.command.Parser.parseQuery(Parser.java:2567)
 at org.h2.command.Parser.parsePrepared(Parser.java:724)
 at org.h2.command.Parser.parse(Parser.java:689)
 at org.h2.command.Parser.parse(Parser.java:661)
 at org.h2.command.CommandContainer.recompileIfRequired(CommandContainer.java:146)
 at org.h2.command.CommandContainer.query(CommandContainer.java:247)
 at org.h2.command.Command.executeQuery(Command.java:190)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions