[
https://issues.apache.org/jira/browse/IGNITE-24514?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Sergey Korotkov updated IGNITE-24514:
-------------------------------------
Description:
Invalid SQL query with the WITH clause (AKA Common Table Expressions - CTEs)
can leave the H2 sql query engine in the state that the following bad things
can happen:
- Table can not be dropped correctly. Call to {{ignite.destroyCache}} or "DROP
TABLE" SQL succseed. Ignite cache is removed but not the table.
- Table can not be recreated (it fails saying table already exists)
- If table has index and created via the Ignite API and {{QueryEntity}}'s the
ignite node crashes with AsserionError.
Sample query:
{code:sql}
WITH cte AS (SELECT id FROM T2)
SELECT * FROM absent_table_to_emulate_statement_parse_failure
{code}
After such a query the drop table fails leaving the foolowing WARN in the node
logs:
{noformat}
[2025-02-13T22:31:07,203][WARN
][exchange-worker-#92%query.SqlFailedCteQueryTest%][SchemaManager$CompoundSchemaChangeListener]
Failed to notify listener (will ignore): Failed to drop database table
[type=T2, table="PUBLIC"."T2"]
org.apache.ignite.internal.processors.query.IgniteSQLException: Failed to drop
database table [type=T2, table="PUBLIC"."T2"]
at
org.apache.ignite.internal.processors.query.h2.H2SchemaManager.dropTable(H2SchemaManager.java:213)
~[classes/:?]
at
org.apache.ignite.internal.processors.query.h2.H2SchemaManager.onSqlTypeDropped(H2SchemaManager.java:183)
~[classes/:?]
at
org.apache.ignite.internal.processors.query.schema.management.SchemaManager$CompoundSchemaChangeListener.lambda$onSqlTypeDropped$10(SchemaManager.java:1397)
~[classes/:?]
at
org.apache.ignite.internal.processors.query.schema.management.SchemaManager$CompoundSchemaChangeListener.executeSafe(SchemaManager.java:1459)
~[classes/:?]
at
org.apache.ignite.internal.processors.query.schema.management.SchemaManager$CompoundSchemaChangeListener.lambda$onSqlTypeDropped$11(SchemaManager.java:1397)
~[classes/:?]
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[?:?]
at
org.apache.ignite.internal.processors.query.schema.management.SchemaManager$CompoundSchemaChangeListener.onSqlTypeDropped(SchemaManager.java:1397)
~[classes/:?]
at
org.apache.ignite.internal.processors.query.schema.management.SchemaManager.onCacheStopped(SchemaManager.java:446)
~[classes/:?]
at
org.apache.ignite.internal.processors.query.GridQueryProcessor.onCacheStop0(GridQueryProcessor.java:2462)
~[classes/:?]
at
org.apache.ignite.internal.processors.query.GridQueryProcessor.onCacheStop(GridQueryProcessor.java:1322)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.stopCache(GridCacheProcessor.java:1041)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.prepareCacheStop(GridCacheProcessor.java:2610)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.prepareCacheStop(GridCacheProcessor.java:2589)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.lambda$processCacheStopRequestOnExchangeDone$a1367cb0$1(GridCacheProcessor.java:2830)
~[classes/:?]
at
org.apache.ignite.internal.util.IgniteUtils.doInParallel(IgniteUtils.java:11624)
[classes/:?]
at
org.apache.ignite.internal.util.IgniteUtils.doInParallel(IgniteUtils.java:11526)
[classes/:?]
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.processCacheStopRequestOnExchangeDone(GridCacheProcessor.java:2804)
[classes/:?]
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.onExchangeDone(GridCacheProcessor.java:2956)
[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.onDone(GridDhtPartitionsExchangeFuture.java:2467)
[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.finishExchangeOnCoordinator(GridDhtPartitionsExchangeFuture.java:3945)
[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.onAllReceived(GridDhtPartitionsExchangeFuture.java:3717)
[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.distributedExchange(GridDhtPartitionsExchangeFuture.java:1768)
[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.init(GridDhtPartitionsExchangeFuture.java:1049)
[classes/:?]
at
org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.body0(GridCachePartitionExchangeManager.java:3170)
[classes/:?]
at
org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.body(GridCachePartitionExchangeManager.java:3004)
[classes/:?]
at
org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:125)
[classes/:?]
at java.base/java.lang.Thread.run(Thread.java:829) [?:?]
Caused by: org.h2.jdbc.JdbcSQLException: General error:
"java.lang.NullPointerException"; SQL statement:
DROP TABLE IF EXISTS "PUBLIC"."T2" [50000-197]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
~[h2-1.4.197.jar:1.4.197]
at org.h2.message.DbException.get(DbException.java:168)
~[h2-1.4.197.jar:1.4.197]
at org.h2.message.DbException.convert(DbException.java:307)
~[h2-1.4.197.jar:1.4.197]
at org.h2.command.Command.executeUpdate(Command.java:274)
~[h2-1.4.197.jar:1.4.197]
at
org.h2.jdbc.JdbcStatement.executeUpdateInternal(JdbcStatement.java:169)
~[h2-1.4.197.jar:1.4.197]
at org.h2.jdbc.JdbcStatement.executeUpdate(JdbcStatement.java:126)
~[h2-1.4.197.jar:1.4.197]
at
org.apache.ignite.internal.processors.query.h2.H2SchemaManager.dropTable(H2SchemaManager.java:209)
~[classes/:?]
... 26 more
Caused by: java.lang.NullPointerException
at org.h2.engine.Session.removeLocalTempTable(Session.java:407)
~[h2-1.4.197.jar:1.4.197]
at org.h2.engine.Database.removeSchemaObject(Database.java:1884)
~[h2-1.4.197.jar:1.4.197]
at org.h2.table.Table.removeChildrenAndResources(Table.java:531)
~[h2-1.4.197.jar:1.4.197]
at
org.apache.ignite.internal.processors.query.h2.opt.GridH2Table.removeChildrenAndResources(GridH2Table.java:614)
~[classes/:?]
at org.h2.engine.Database.removeSchemaObject(Database.java:1918)
~[h2-1.4.197.jar:1.4.197]
at org.h2.command.ddl.DropTable.executeDrop(DropTable.java:119)
~[h2-1.4.197.jar:1.4.197]
at org.h2.command.ddl.DropTable.update(DropTable.java:130)
~[h2-1.4.197.jar:1.4.197]
at org.h2.command.CommandContainer.update(CommandContainer.java:102)
~[h2-1.4.197.jar:1.4.197]
at org.h2.command.Command.executeUpdate(Command.java:261)
~[h2-1.4.197.jar:1.4.197]
at
org.h2.jdbc.JdbcStatement.executeUpdateInternal(JdbcStatement.java:169)
~[h2-1.4.197.jar:1.4.197]
at org.h2.jdbc.JdbcStatement.executeUpdate(JdbcStatement.java:126)
~[h2-1.4.197.jar:1.4.197]
at
org.apache.ignite.internal.processors.query.h2.H2SchemaManager.dropTable(H2SchemaManager.java:209)
~[classes/:?]
... 26 more
{noformat}
was:
Invalid SQL query with the WITH clause (AKA Common Table Expressions - CTEs)
can leave the H2 sql query engine in the state that the following bad things
can happen:
- Table can not be dropped correctly. Call to {{ignite.destroyCache}} or "DROP
TABLE" SQL succseed. Ignite cache is removed but not the table.
- Table can not be recreated (it fails saying table already exists)
- If table has index and created via the Ignite API and {{QueryEntity}}'s the
ignite node crashes with AsserionError.
Sample query:
{code:sql}
WITH cte AS (SELECT id FROM T2)
SELECT * FROM absent_table_to_emulate_statement_parse_failure
{code}
After such a query the drop table fails leaving the foolowing WARN in the node
logs:
> Invalid SQL query prevent table drop and causes node crash on table recreate
> ----------------------------------------------------------------------------
>
> Key: IGNITE-24514
> URL: https://issues.apache.org/jira/browse/IGNITE-24514
> Project: Ignite
> Issue Type: Bug
> Reporter: Sergey Korotkov
> Assignee: Sergey Korotkov
> Priority: Major
>
> Invalid SQL query with the WITH clause (AKA Common Table Expressions - CTEs)
> can leave the H2 sql query engine in the state that the following bad things
> can happen:
> - Table can not be dropped correctly. Call to {{ignite.destroyCache}} or
> "DROP TABLE" SQL succseed. Ignite cache is removed but not the table.
> - Table can not be recreated (it fails saying table already exists)
> - If table has index and created via the Ignite API and {{QueryEntity}}'s
> the ignite node crashes with AsserionError.
>
> Sample query:
> {code:sql}
> WITH cte AS (SELECT id FROM T2)
> SELECT * FROM absent_table_to_emulate_statement_parse_failure
> {code}
> After such a query the drop table fails leaving the foolowing WARN in the
> node logs:
> {noformat}
> [2025-02-13T22:31:07,203][WARN
> ][exchange-worker-#92%query.SqlFailedCteQueryTest%][SchemaManager$CompoundSchemaChangeListener]
> Failed to notify listener (will ignore): Failed to drop database table
> [type=T2, table="PUBLIC"."T2"]
> org.apache.ignite.internal.processors.query.IgniteSQLException: Failed to
> drop database table [type=T2, table="PUBLIC"."T2"]
> at
> org.apache.ignite.internal.processors.query.h2.H2SchemaManager.dropTable(H2SchemaManager.java:213)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.query.h2.H2SchemaManager.onSqlTypeDropped(H2SchemaManager.java:183)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.query.schema.management.SchemaManager$CompoundSchemaChangeListener.lambda$onSqlTypeDropped$10(SchemaManager.java:1397)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.query.schema.management.SchemaManager$CompoundSchemaChangeListener.executeSafe(SchemaManager.java:1459)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.query.schema.management.SchemaManager$CompoundSchemaChangeListener.lambda$onSqlTypeDropped$11(SchemaManager.java:1397)
> ~[classes/:?]
> at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[?:?]
> at
> org.apache.ignite.internal.processors.query.schema.management.SchemaManager$CompoundSchemaChangeListener.onSqlTypeDropped(SchemaManager.java:1397)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.query.schema.management.SchemaManager.onCacheStopped(SchemaManager.java:446)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.query.GridQueryProcessor.onCacheStop0(GridQueryProcessor.java:2462)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.query.GridQueryProcessor.onCacheStop(GridQueryProcessor.java:1322)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.cache.GridCacheProcessor.stopCache(GridCacheProcessor.java:1041)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.cache.GridCacheProcessor.prepareCacheStop(GridCacheProcessor.java:2610)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.cache.GridCacheProcessor.prepareCacheStop(GridCacheProcessor.java:2589)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.cache.GridCacheProcessor.lambda$processCacheStopRequestOnExchangeDone$a1367cb0$1(GridCacheProcessor.java:2830)
> ~[classes/:?]
> at
> org.apache.ignite.internal.util.IgniteUtils.doInParallel(IgniteUtils.java:11624)
> [classes/:?]
> at
> org.apache.ignite.internal.util.IgniteUtils.doInParallel(IgniteUtils.java:11526)
> [classes/:?]
> at
> org.apache.ignite.internal.processors.cache.GridCacheProcessor.processCacheStopRequestOnExchangeDone(GridCacheProcessor.java:2804)
> [classes/:?]
> at
> org.apache.ignite.internal.processors.cache.GridCacheProcessor.onExchangeDone(GridCacheProcessor.java:2956)
> [classes/:?]
> at
> org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.onDone(GridDhtPartitionsExchangeFuture.java:2467)
> [classes/:?]
> at
> org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.finishExchangeOnCoordinator(GridDhtPartitionsExchangeFuture.java:3945)
> [classes/:?]
> at
> org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.onAllReceived(GridDhtPartitionsExchangeFuture.java:3717)
> [classes/:?]
> at
> org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.distributedExchange(GridDhtPartitionsExchangeFuture.java:1768)
> [classes/:?]
> at
> org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.init(GridDhtPartitionsExchangeFuture.java:1049)
> [classes/:?]
> at
> org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.body0(GridCachePartitionExchangeManager.java:3170)
> [classes/:?]
> at
> org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.body(GridCachePartitionExchangeManager.java:3004)
> [classes/:?]
> at
> org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:125)
> [classes/:?]
> at java.base/java.lang.Thread.run(Thread.java:829) [?:?]
> Caused by: org.h2.jdbc.JdbcSQLException: General error:
> "java.lang.NullPointerException"; SQL statement:
> DROP TABLE IF EXISTS "PUBLIC"."T2" [50000-197]
> at org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
> ~[h2-1.4.197.jar:1.4.197]
> at org.h2.message.DbException.get(DbException.java:168)
> ~[h2-1.4.197.jar:1.4.197]
> at org.h2.message.DbException.convert(DbException.java:307)
> ~[h2-1.4.197.jar:1.4.197]
> at org.h2.command.Command.executeUpdate(Command.java:274)
> ~[h2-1.4.197.jar:1.4.197]
> at
> org.h2.jdbc.JdbcStatement.executeUpdateInternal(JdbcStatement.java:169)
> ~[h2-1.4.197.jar:1.4.197]
> at org.h2.jdbc.JdbcStatement.executeUpdate(JdbcStatement.java:126)
> ~[h2-1.4.197.jar:1.4.197]
> at
> org.apache.ignite.internal.processors.query.h2.H2SchemaManager.dropTable(H2SchemaManager.java:209)
> ~[classes/:?]
> ... 26 more
> Caused by: java.lang.NullPointerException
> at org.h2.engine.Session.removeLocalTempTable(Session.java:407)
> ~[h2-1.4.197.jar:1.4.197]
> at org.h2.engine.Database.removeSchemaObject(Database.java:1884)
> ~[h2-1.4.197.jar:1.4.197]
> at org.h2.table.Table.removeChildrenAndResources(Table.java:531)
> ~[h2-1.4.197.jar:1.4.197]
> at
> org.apache.ignite.internal.processors.query.h2.opt.GridH2Table.removeChildrenAndResources(GridH2Table.java:614)
> ~[classes/:?]
> at org.h2.engine.Database.removeSchemaObject(Database.java:1918)
> ~[h2-1.4.197.jar:1.4.197]
> at org.h2.command.ddl.DropTable.executeDrop(DropTable.java:119)
> ~[h2-1.4.197.jar:1.4.197]
> at org.h2.command.ddl.DropTable.update(DropTable.java:130)
> ~[h2-1.4.197.jar:1.4.197]
> at org.h2.command.CommandContainer.update(CommandContainer.java:102)
> ~[h2-1.4.197.jar:1.4.197]
> at org.h2.command.Command.executeUpdate(Command.java:261)
> ~[h2-1.4.197.jar:1.4.197]
> at
> org.h2.jdbc.JdbcStatement.executeUpdateInternal(JdbcStatement.java:169)
> ~[h2-1.4.197.jar:1.4.197]
> at org.h2.jdbc.JdbcStatement.executeUpdate(JdbcStatement.java:126)
> ~[h2-1.4.197.jar:1.4.197]
> at
> org.apache.ignite.internal.processors.query.h2.H2SchemaManager.dropTable(H2SchemaManager.java:209)
> ~[classes/:?]
> ... 26 more
> {noformat}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)