Skip to content

Commit a9345f1

Browse files
hayssamsclaude
andcommitted
Support DuckDB MAP(key, value) column type
DuckDB parameterises a type with other types, e.g. MAP(VARCHAR, INTEGER). Type arguments previously accepted identifiers and literals but not data type tokens. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EqinwHBKuAtPEmtXr3b5P2
1 parent 50a25f0 commit a9345f1

2 files changed

Lines changed: 29 additions & 0 deletions

File tree

‎src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13846,6 +13846,9 @@ ColDataType ColDataType():
1384613846
|
1384713847
tk=<S_IDENTIFIER>
1384813848
|
13849+
// DuckDB parameterises types with other types: MAP(VARCHAR, INTEGER)
13850+
tk=<DATA_TYPE>
13851+
|
1384913852
tk=<K_CHAR>
1385013853
)
1385113854
)

‎src/test/java/net/sf/jsqlparser/statement/select/DuckDBTest.java‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import net.sf.jsqlparser.JSQLParserException;
1313
import net.sf.jsqlparser.schema.Table;
14+
import net.sf.jsqlparser.statement.create.table.CreateTable;
1415
import net.sf.jsqlparser.test.TestUtils;
1516
import org.junit.jupiter.api.Assertions;
1617
import org.junit.jupiter.api.Test;
@@ -91,4 +92,29 @@ void testAntiRemainsUsableAsIdentifier() throws JSQLParserException {
9192
String sqlStr = "SELECT anti FROM t anti";
9293
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
9394
}
95+
96+
@Test
97+
void testMapColumnType() throws JSQLParserException {
98+
String sqlStr = "CREATE TABLE t (m MAP(VARCHAR, INTEGER))";
99+
CreateTable createTable =
100+
(CreateTable) TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
101+
102+
Assertions.assertEquals("MAP",
103+
createTable.getColumnDefinitions().get(0).getColDataType().getDataType());
104+
Assertions.assertEquals(java.util.Arrays.asList("VARCHAR", "INTEGER"),
105+
createTable.getColumnDefinitions().get(0).getColDataType()
106+
.getArgumentsStringList());
107+
}
108+
109+
@Test
110+
void testMapCast() throws JSQLParserException {
111+
String sqlStr = "SELECT CAST(m AS MAP(VARCHAR, INTEGER)) FROM t";
112+
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
113+
}
114+
115+
@Test
116+
void testDecimalTypeArgumentsStillParse() throws JSQLParserException {
117+
String sqlStr = "CREATE TABLE t (a DECIMAL(10, 2), b VARCHAR(255))";
118+
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
119+
}
94120
}

0 commit comments

Comments
 (0)