Skip to content

sketchy json_extract plus join leading to 500 #6407

@nwoolmer

Description

@nwoolmer

To reproduce

SELECT * FROM ( SELECT json_extract(msg, '$.') FROM "a-b-c")  
LEFT JOIN (select 1) ON 1 = 1;

Fails:

java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 16
	at io.questdb.std.ObjList.getQuick(ObjList.java:177)
	at io.questdb.cairo.AbstractRecordMetadata.getColumnMetadata(AbstractRecordMetadata.java:63)
	at io.questdb.cairo.AbstractRecordMetadata.getColumnType(AbstractRecordMetadata.java:73)
	at io.questdb.griffin.SqlCodeGenerator.generateSelectChoose(SqlCodeGenerator.java:4668)
	at io.questdb.griffin.SqlCodeGenerator.generateSelect(SqlCodeGenerator.java:4542)
	at io.questdb.griffin.SqlCodeGenerator.generateQuery0(SqlCodeGenerator.java:4044)
	at io.questdb.griffin.SqlCodeGenerator.generateQuery(SqlCodeGenerator.java:4032)
	at io.questdb.griffin.SqlCodeGenerator.generate(SqlCodeGenerator.java:641)

Cause:

for (int i = 0, n = columns.size(); i < n; i++) {
QueryColumn queryColumn = columns.getQuick(i);
CharSequence columnName = queryColumn.getAlias();
int index = metadata.getColumnIndexQuiet(queryColumn.getAst().token);
assert index > -1 : "wtf? " + queryColumn.getAst().token;
int updateColumnIndex = updateColumnNames.indexOf(columnName);
int updateColumnType = updateColumnTypes.get(updateColumnIndex);
if (updateColumnType != metadata.getColumnType(index)) {
columnTypeMismatch = true;
break;
}
}

We should upgrade the assertion to a true error. In prod, it is an AssertionError, but in dev, you get the one I posted.

The optimiser generates a wild alias like this:

_xQdbA1."json_extract(msg, '$.')"

And the names don't line up any more.

Workaround.. alias the function

SELECT * FROM ( SELECT json_extract(msg, '$.') as id FROM "BINANCE-USDMF-L2")  
LEFT JOIN (select 1) ON 1 = 1;

QuestDB version:

QuestDB 9.2.0+

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

N/A

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

N/A

Full Name:

Nick Woolmer

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

Labels

BugIncorrect or unexpected behaviorSQLIssues or changes relating to SQL executionexternal

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions