Skip to content

Commit 552019a

Browse files
feat: split catalog and schema
Signed-off-by: Andreas Reichel <[email protected]>
1 parent ac46c43 commit 552019a

File tree

3 files changed

+58
-1
lines changed

3 files changed

+58
-1
lines changed

src/main/java/net/sf/jsqlparser/schema/Table.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,44 @@ public String getUnquotedSchemaName() {
170170
}
171171

172172
public Table setSchemaName(String schemaName) {
173-
this.setIndex(SCHEMA_IDX, schemaName);
173+
174+
// BigQuery seems to allow things like: `catalogName.schemaName.tableName` in only one pair
175+
// of quotes
176+
// however, some people believe that Dots in Names are a good idea, so provide a switch-off
177+
boolean splitNamesOnDelimiter = System.getProperty("SPLIT_NAMES_ON_DELIMITER") == null ||
178+
!List
179+
.of("0", "N", "n", "FALSE", "false", "OFF", "off")
180+
.contains(System.getProperty("SPLIT_NAMES_ON_DELIMITER"));
181+
182+
if (MultiPartName.isQuoted(schemaName) && schemaName.contains(".") && splitNamesOnDelimiter) {
183+
String[] parts = MultiPartName.unquote(schemaName).split("\\.");
184+
switch (parts.length) {
185+
case 2:
186+
setIndex(DATABASE_IDX, "\"" + parts[0] + "\"");
187+
setIndex(SCHEMA_IDX, "\"" + parts[1] + "\"");
188+
break;
189+
case 1:
190+
setIndex(SCHEMA_IDX, "\"" + parts[0] + "\"");
191+
break;
192+
default:
193+
throw new RuntimeException("Invalid schema name: " + schemaName);
194+
}
195+
} else if (schemaName.contains(".") && splitNamesOnDelimiter) {
196+
String[] parts = MultiPartName.unquote(schemaName).split("\\.");
197+
switch (parts.length) {
198+
case 2:
199+
setIndex(DATABASE_IDX, parts[0]);
200+
setIndex(SCHEMA_IDX, parts[1]);
201+
break;
202+
case 1:
203+
setIndex(SCHEMA_IDX, parts[0]);
204+
break;
205+
default:
206+
throw new RuntimeException("Invalid schema name: " + schemaName);
207+
}
208+
} else {
209+
this.setIndex(SCHEMA_IDX, schemaName);
210+
}
174211
return this;
175212
}
176213

src/test/java/net/sf/jsqlparser/schema/TableTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,13 @@ void testClone() {
120120
Assertions.assertNotSame(t.clone(), t);
121121
Assertions.assertNotEquals(t.clone(), t);
122122
}
123+
124+
@Test
125+
void testWithSchema() {
126+
Table t = new Table("a");
127+
t.setSchemaName("UNNAMED.session1");
128+
129+
Assertions.assertEquals("UNNAMED", t.getDatabaseName());
130+
Assertions.assertEquals("session1", t.getSchemaName());
131+
}
123132
}

src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,4 +1073,15 @@ void testUniqueAfterForeignKeyIssue2082() throws JSQLParserException {
10731073
", UNIQUE (employee_name));";
10741074
assertSqlCanBeParsedAndDeparsed(sqlStr, true);
10751075
}
1076+
1077+
@Test
1078+
void testWithCatalog() throws JSQLParserException {
1079+
String sqlStr="CREATE TABLE UNNAMED.session1.a (b VARCHAR (1))";
1080+
CreateTable st = (CreateTable) assertSqlCanBeParsedAndDeparsed(sqlStr, true);
1081+
1082+
Table t = st.getTable();
1083+
assertEquals("UNNAMED", t.getCatalogName());
1084+
assertEquals("session1", t.getSchemaName());
1085+
assertEquals("a", t.getUnquotedName());
1086+
}
10761087
}

0 commit comments

Comments
 (0)