[ 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)