From 8726ddd77e3605c562b5c7ef25e6c048302762e3 Mon Sep 17 00:00:00 2001 From: Vlad Ilyushchenko Date: Tue, 25 Aug 2020 14:22:19 +0100 Subject: [PATCH] fix(griffin): as of join failed when timestamp was not in select clause --- .../io/questdb/griffin/SqlCodeGenerator.java | 4 ++++ .../java/io/questdb/griffin/SqlParserTest.java | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/core/src/main/java/io/questdb/griffin/SqlCodeGenerator.java b/core/src/main/java/io/questdb/griffin/SqlCodeGenerator.java index 04c97984dea6..4bfd928483b3 100644 --- a/core/src/main/java/io/questdb/griffin/SqlCodeGenerator.java +++ b/core/src/main/java/io/questdb/griffin/SqlCodeGenerator.java @@ -623,6 +623,7 @@ private RecordCursorFactory generateJoins(QueryModel model, SqlExecutionContext RecordCursorFactory master = null; CharSequence masterAlias = null; + executionContext.pushTimestampRequiredFlag(true); try { int n = ordered.size(); assert n > 0; @@ -816,6 +817,8 @@ private RecordCursorFactory generateJoins(QueryModel model, SqlExecutionContext } catch (CairoException | SqlException e) { Misc.free(master); throw e; + } finally { + executionContext.popTimestampRequiredFlag(); } } @@ -1452,6 +1455,7 @@ private RecordCursorFactory generateSelectChoose(QueryModel model, SqlExecutionC metadata.isSymbolTableStatic(timestampIndex) ) ); + selectMetadata.setTimestampIndex(selectMetadata.getColumnCount() - 1); } return new SelectedRecordCursorFactory(selectMetadata, columnCrossIndex, factory); diff --git a/core/src/test/java/io/questdb/griffin/SqlParserTest.java b/core/src/test/java/io/questdb/griffin/SqlParserTest.java index efc601ad6c27..5700b0bfa1c6 100644 --- a/core/src/test/java/io/questdb/griffin/SqlParserTest.java +++ b/core/src/test/java/io/questdb/griffin/SqlParserTest.java @@ -2747,6 +2747,23 @@ public void testJoinTimestampPropagation() throws SqlException { ); } + @Test + public void testJoinTimestampPropagationWhenTimestampNotSelected() throws SqlException { + assertQuery( + "select-distinct id from (select-choose [id] id from ((select-choose [a.id id] a.created ts_stop, a.id id, b.created ts_start, b.id id1 from (select [id, created] from (select-choose [id] id, created, event, timestamp from ((select-choose [id, created] id, created, event, timestamp from (select [id, created, event] from telemetry_users timestamp (timestamp) where event = 101 and id != '0x05ab1e873d165b00000005743f2c17') order by created) _xQdbA7) timestamp (created)) a lt join select [id, created] from (select-choose [id] id, created, event, timestamp from ((select-choose [id, created] id, created, event, timestamp from (select [id, created, event] from telemetry_users timestamp (timestamp) where event = 100) order by created) _xQdbA4) timestamp (created)) b on b.id = a.id post-join-where a.created - b.created > 10000000000)) _xQdbA1))", + "with \n" + + " starts as ((telemetry_users where event = 100 order by created) timestamp(created)),\n" + + " stops as ((telemetry_users where event = 101 order by created) timestamp(created))\n" + + "\n" + + "select distinct id from (select a.created ts_stop, a.id, b.created ts_start, b.id from stops a lt join starts b on (id)) where id <> '0x05ab1e873d165b00000005743f2c17' and ts_stop - ts_start > 10000000000\n", + modelOf("telemetry_users") + .col("id", ColumnType.LONG256) + .col("created", ColumnType.TIMESTAMP) + .col("event", ColumnType.SHORT) + .timestamp() + ); + } + @Test public void testJoinTriangle() throws Exception { assertQuery(