questdb icon indicating copy to clipboard operation
questdb copied to clipboard

Invalid query accepted, then results in unexpected error

Open mtopolnik opened this issue 1 year ago • 2 comments

To reproduce

This small example uses a SELECT MAX to get a single-row result set, then wants to use that as a value in equality comparison. The compiler allows it, and then the query fails at execution time.

create table x (a_long LONG);

insert into x values (1), (2), (3);

WITH MaxLong AS ( SELECT MAX(a_long) AS max_long FROM x )
SELECT * FROM x WHERE a_long = (SELECT max_long FROM MaxLong);
2024-07-11T08:37:02.713197Z E i.q.g.e.t.AsyncFilteredRecordCursor filter error [ex=
io.questdb.cairo.CairoException: [-1] unexpected filter error
	at io.questdb.cairo.CairoException.instance(CairoException.java:319)
	at io.questdb.cairo.CairoException.nonCritical(CairoException.java:120)
	at io.questdb.griffin.engine.table.AsyncFilteredRecordCursor.fetchNextFrame(AsyncFilteredRecordCursor.java:320)
	at io.questdb.griffin.engine.table.AsyncFilteredRecordCursor.hasNext(AsyncFilteredRecordCursor.java:169)
	at io.questdb.griffin.engine.QueryProgress$RegisteredRecordCursor.hasNext(QueryProgress.java:276)
	at io.questdb.cutlass.http.processors.JsonQueryProcessorState.setupFirstRecord(JsonQueryProcessorState.java:823)
	at io.questdb.cutlass.http.processors.JsonQueryProcessorState.onSetupFirstRecord(JsonQueryProcessorState.java:773)
	at io.questdb.cutlass.http.processors.JsonQueryProcessorState.resume(JsonQueryProcessorState.java:929)
	at io.questdb.cutlass.http.processors.JsonQueryProcessor.doResumeSend(JsonQueryProcessor.java:336)
	at io.questdb.cutlass.http.processors.JsonQueryProcessor.executeSelect(JsonQueryProcessor.java:594)
	at io.questdb.cutlass.http.processors.JsonQueryProcessor.executeNewSelect(JsonQueryProcessor.java:563)
	at io.questdb.cutlass.http.processors.JsonQueryProcessor.compileAndExecuteQuery(JsonQueryProcessor.java:477)
	at io.questdb.cutlass.http.processors.JsonQueryProcessor.execute0(JsonQueryProcessor.java:191)
	at io.questdb.cutlass.http.processors.JsonQueryProcessor.onRequestComplete(JsonQueryProcessor.java:266)
	at io.questdb.cutlass.http.HttpConnectionContext.handleClientRecv(HttpConnectionContext.java:915)
	at io.questdb.cutlass.http.HttpConnectionContext.handleClientOperation(HttpConnectionContext.java:256)
	at io.questdb.cutlass.http.HttpServer.handleClientOperation(HttpServer.java:307)
	at io.questdb.cutlass.http.HttpServer$1.lambda$$0(HttpServer.java:114)
	at io.questdb.network.AbstractIODispatcher.processIOQueue(AbstractIODispatcher.java:199)
	at io.questdb.cutlass.http.HttpServer$1.run(HttpServer.java:118)
	at io.questdb.mp.Worker.run(Worker.java:151)
]```

### QuestDB version:

8.0.1

### Full Name:

Marko Topolnik

### Affiliation:

QuestDB

mtopolnik avatar Jul 11 '24 08:07 mtopolnik

Duplicate of #4627

mtopolnik avatar Jul 11 '24 08:07 mtopolnik

after https://github.com/questdb/questdb/pull/4632 it no longer results in unexpected filter error.

WITH MaxLong AS ( SELECT MAX(a_long) AS max_long FROM x )
SELECT * FROM x WHERE a_long = (SELECT max_long FROM MaxLong);

now returns this error: cannot compare TIMESTAMP and LONG

not sure if that's better since it's still not helpful. like, where is the TIMESTAMP going from? some crazy overload from a cursor maybe?

jerrinot avatar Jul 26 '24 13:07 jerrinot