From 48cea608f5a0984eb773d7d56c256844ed81d8d2 Mon Sep 17 00:00:00 2001 From: Vlad Ilyushchenko Date: Fri, 12 Jun 2020 11:03:34 +0100 Subject: [PATCH] fix(griffin): GORM sends ';' after login, making sure we reply to that. (#388) --- .../questdb/cutlass/pgwire/PGConnectionContext.java | 5 +++++ .../main/java/io/questdb/griffin/SqlKeywords.java | 4 ++++ .../engine/table/TableListRecordCursorFactory.java | 2 +- .../io/questdb/cutlass/pgwire/PGJobContextTest.java | 13 +++++++++++++ .../java/io/questdb/griffin/ShowTablesTest.java | 8 ++++---- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/io/questdb/cutlass/pgwire/PGConnectionContext.java b/core/src/main/java/io/questdb/cutlass/pgwire/PGConnectionContext.java index 0b0cc0d12..f7b08638f 100644 --- a/core/src/main/java/io/questdb/cutlass/pgwire/PGConnectionContext.java +++ b/core/src/main/java/io/questdb/cutlass/pgwire/PGConnectionContext.java @@ -1214,6 +1214,11 @@ public class PGConnectionContext implements IOContext, Mutable { prepareForNewQuery(); parseQueryText(lo, limit - 1); + if (SqlKeywords.isSemicolon(queryText)) { + sendExecuteTail(TAIL_SUCCESS); + return; + } + final Object statement = factoryCache.peek(queryText); if (statement == null) { CompiledQuery cc = compiler.compile(queryText, sqlExecutionContext); diff --git a/core/src/main/java/io/questdb/griffin/SqlKeywords.java b/core/src/main/java/io/questdb/griffin/SqlKeywords.java index 1be4ce6e4..a3269f09b 100644 --- a/core/src/main/java/io/questdb/griffin/SqlKeywords.java +++ b/core/src/main/java/io/questdb/griffin/SqlKeywords.java @@ -46,6 +46,10 @@ public class SqlKeywords { && (tok.charAt(i) | 32) == 'n'; } + public static boolean isSemicolon(CharSequence tok) { + return tok.length() == 1 && (tok.charAt(0) | 32) == ';'; + } + public static boolean isOnKeyword(CharSequence tok) { if (tok.length() != 2) { return false; diff --git a/core/src/main/java/io/questdb/griffin/engine/table/TableListRecordCursorFactory.java b/core/src/main/java/io/questdb/griffin/engine/table/TableListRecordCursorFactory.java index f743119e5..ec5e6992b 100644 --- a/core/src/main/java/io/questdb/griffin/engine/table/TableListRecordCursorFactory.java +++ b/core/src/main/java/io/questdb/griffin/engine/table/TableListRecordCursorFactory.java @@ -41,7 +41,7 @@ public class TableListRecordCursorFactory implements RecordCursorFactory { static { final GenericRecordMetadata metadata = new GenericRecordMetadata(); - metadata.add(new TableColumnMetadata("tableName", ColumnType.STRING)); + metadata.add(new TableColumnMetadata("table", ColumnType.STRING)); METADATA = metadata; } diff --git a/core/src/test/java/io/questdb/cutlass/pgwire/PGJobContextTest.java b/core/src/test/java/io/questdb/cutlass/pgwire/PGJobContextTest.java index edb5eb38b..824d3f7c3 100644 --- a/core/src/test/java/io/questdb/cutlass/pgwire/PGJobContextTest.java +++ b/core/src/test/java/io/questdb/cutlass/pgwire/PGJobContextTest.java @@ -1336,6 +1336,19 @@ public class PGJobContextTest extends AbstractGriffinTest { assertHexScript(script); } + @Test + public void testGORMConnect() throws Exception { + // GORM is a Golang ORM tool + assertHexScript( + ">0000005e0003000064617461626173650071646200646174657374796c650049534f2c204d44590065787472615f666c6f61745f646967697473003200757365720061646d696e00636c69656e745f656e636f64696e6700555446380000\n" + + "<520000000800000003\n" + + ">700000000a717565737400\n" + + "<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d6500517565737444420053000000187365727665725f76657273696f6e0031312e33005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" + + ">51000000063b00\n" + + "<43000000063b005a0000000549\n" + ); + } + @Test public void testSimpleSimpleQuery() throws Exception { TestUtils.assertMemoryLeak(() -> { diff --git a/core/src/test/java/io/questdb/griffin/ShowTablesTest.java b/core/src/test/java/io/questdb/griffin/ShowTablesTest.java index 7ba718e4d..ca5beffe3 100644 --- a/core/src/test/java/io/questdb/griffin/ShowTablesTest.java +++ b/core/src/test/java/io/questdb/griffin/ShowTablesTest.java @@ -33,7 +33,7 @@ public class ShowTablesTest extends AbstractGriffinTest { public void testShowTablesWithSingleTable() throws Exception { assertMemoryLeak(() -> { compiler.compile("create table balances(cust_id int, ccy symbol, balance double)", sqlExecutionContext); - assertQuery("tableName\nbalances\n", "show tables", null, false, sqlExecutionContext, false); + assertQuery("table\nbalances\n", "show tables", null, false, sqlExecutionContext, false); }); } @@ -41,10 +41,10 @@ public class ShowTablesTest extends AbstractGriffinTest { public void testShowTablesWithDrop() throws Exception { assertMemoryLeak(() -> { compiler.compile("create table balances(cust_id int, ccy symbol, balance double)", sqlExecutionContext); - assertQuery("tableName\nbalances\n", "show tables", null, false, sqlExecutionContext, false); + assertQuery("table\nbalances\n", "show tables", null, false, sqlExecutionContext, false); compiler.compile("create table balances2(cust_id int, ccy symbol, balance double)", sqlExecutionContext); compiler.compile("drop table balances", sqlExecutionContext); - assertQuery("tableName\nbalances2\n", "show tables", null, false, sqlExecutionContext, false); + assertQuery("table\nbalances2\n", "show tables", null, false, sqlExecutionContext, false); }); } @@ -99,7 +99,7 @@ public class ShowTablesTest extends AbstractGriffinTest { public void testShowTablesWithFunction() throws Exception { assertMemoryLeak(() -> { compiler.compile("create table balances(cust_id int, ccy symbol, balance double)", sqlExecutionContext); - assertQuery("tableName\nbalances\n", "select * from all_tables()", null, false, sqlExecutionContext, false); + assertQuery("table\nbalances\n", "select * from all_tables()", null, false, sqlExecutionContext, false); }); } -- GitLab