Skip to content

EXPLAIN is broken for some cases #6194

@javier

Description

@javier

To reproduce

Go to demo and try these three queries:

EXPLAIN CREATE TABLE trades AS
(
  SELECT
    rnd_symbol('a', 'b') symbol,
    rnd_symbol('Buy', 'Sell') side,
    rnd_double() price,
    rnd_double() amount,
    x::timestamp timestamp
  FROM long_sequence(10)
) TIMESTAMP(timestamp) PARTITION BY DAY;


EXPLAIN INSERT INTO trades
  SELECT
    rnd_symbol('a', 'b') symbol,
    rnd_symbol('Buy', 'Sell') side,
    rnd_double() price,
    rnd_double() amount,
    x::timestamp timestamp
  FROM long_sequence(10);

 EXPLAIN UPDATE trades SET amount = 0 WHERE timestamp IN '2022-11-11';

The INSERT and UPDATE versions complain about permissions, but we are just explaining. We should be good.

Now, for a second issue. Run the same queries on your local instance with permissions. The last query breaks with this trace

2025-09-26T10:47:10.924606Z C i.q.c.h.p.JsonQueryProcessorState [1685774664889] internal error [ex=
java.lang.UnsupportedOperationException
	at io.questdb.cairo.sql.RecordCursorFactory.getCursor(RecordCursorFactory.java:154)
	at io.questdb.griffin.engine.table.FilteredRecordCursorFactory.getCursor(FilteredRecordCursorFactory.java:59)
	at io.questdb.griffin.engine.table.VirtualRecordCursorFactory.getCursor(VirtualRecordCursorFactory.java:106)
	at io.questdb.griffin.SqlCodeGenerator$RecordCursorFactoryStub.getCursor(SqlCodeGenerator.java:6807)
	at io.questdb.griffin.engine.ExplainPlanFactory$ExplainPlanRecordCursor.of(ExplainPlanFactory.java:141)
	at io.questdb.griffin.engine.ExplainPlanFactory.getCursor(ExplainPlanFactory.java:60)
	at io.questdb.cutlass.http.processors.JsonQueryProcessor.executeSelect0(JsonQueryProcessor.java:686)
	at io.questdb.cutlass.http.processors.JsonQueryProcessor.executeExplain(JsonQueryProcessor.java:627)
	at io.questdb.cutlass.http.processors.JsonQueryProcessor.compileAndExecuteQuery(JsonQueryProcessor.java:513)
	at io.questdb.cutlass.http.processors.JsonQueryProcessor.execute0(JsonQueryProcessor.java:215)
	at io.questdb.cutlass.http.processors.JsonQueryProcessor.onRequestComplete(JsonQueryProcessor.java:292)
	at io.questdb.cutlass.http.HttpConnectionContext.handleClientRecv(HttpConnectionContext.java:910)
	at io.questdb.cutlass.http.HttpConnectionContext.handleClientOperation(HttpConnectionContext.java:307)
	at io.questdb.cutlass.http.HttpServer.handleClientOperation(HttpServer.java:343)
	at io.questdb.cutlass.http.HttpServer$1.lambda$$0(HttpServer.java:129)
	at io.questdb.network.AbstractIODispatcher.processIOQueue(AbstractIODispatcher.java:217)
	at io.questdb.cutlass.http.HttpServer$1.run(HttpServer.java:133)
	at io.questdb.mp.Worker.run(Worker.java:152)

I checked and this has been broken for a while. Back in QuestDB 7.0.0 it was working. As of QuestDB 8.0.1 it breaks. So it happened somewhere in between.

QuestDB version:

8.0.0 and higher

OS, in case of Docker specify Docker and the Host OS:

ubuntu and mac

File System, in case of Docker specify Host File System:

ext4

Full Name:

javier

Affiliation:

questdb

Have you followed Linux, MacOs kernel configuration steps to increase Maximum open files and Maximum virtual memory areas limit?

  • Yes, I have

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    SQLIssues or changes relating to SQL executioninternalregression

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions