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 0b0cc0d12b1a7c6f53c985e47fe7f7964fcf513c..f7b08638fe0c3fb0656ab6d5c185f0fb179bb5c1 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 1be4ce6e420af56a8c5f1679ff17da734d95a8d0..a3269f09bc474199c5ae68e7f56ed0f3da634389 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 f743119e5ceea534a6a50e9cf5c3d5d2425ba5d6..ec5e6992be5636b0266c63a7f79cf8bd2c3b454a 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 edb5eb38b6ca412bce549c6a20b26e4946151bcf..824d3f7c36a9e8edc12ee9be5c5957ab7eb371a8 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 7ba718e4d16aa75ad7aa26ad45d9bab184006e92..ca5beffe3de6ab9f95153d6957010c017de69f8b 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); }); }