Skip to content

Commit 5c360a2

Browse files
feat: BigQuery SELECT AS STRUCT ... and SELECT AS VALUE ...
Signed-off-by: Andreas Reichel <[email protected]>
1 parent c9ecfc6 commit 5c360a2

File tree

4 files changed

+58
-0
lines changed

4 files changed

+58
-0
lines changed

src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java

+26
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,12 @@
2929
@SuppressWarnings({"PMD.CyclomaticComplexity"})
3030
public class PlainSelect extends Select {
3131

32+
public enum BigQuerySelectQualifier {
33+
AS_STRUCT, AS_VALUE
34+
}
35+
3236
private Distinct distinct = null;
37+
private BigQuerySelectQualifier bigQuerySelectQualifier = null;
3338
private List<SelectItem<?>> selectItems;
3439
private List<Table> intoTables;
3540
private FromItem fromItem;
@@ -369,6 +374,15 @@ public void setDistinct(Distinct distinct) {
369374
this.distinct = distinct;
370375
}
371376

377+
public BigQuerySelectQualifier getBigQuerySelectQualifier() {
378+
return bigQuerySelectQualifier;
379+
}
380+
381+
public PlainSelect setBigQuerySelectQualifier(BigQuerySelectQualifier bigQuerySelectQualifier) {
382+
this.bigQuerySelectQualifier = bigQuerySelectQualifier;
383+
return this;
384+
}
385+
372386
public Expression getHaving() {
373387
return having;
374388
}
@@ -478,6 +492,18 @@ public StringBuilder appendSelectBodyTo(StringBuilder builder) {
478492
if (distinct != null) {
479493
builder.append(distinct).append(" ");
480494
}
495+
496+
if (bigQuerySelectQualifier != null) {
497+
switch (bigQuerySelectQualifier) {
498+
case AS_STRUCT:
499+
builder.append("AS STRUCT ");
500+
break;
501+
case AS_VALUE:
502+
builder.append("AS VALUE ");
503+
break;
504+
}
505+
}
506+
481507
if (top != null) {
482508
builder.append(top).append(" ");
483509
}

src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java

+11
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,17 @@ public void visit(PlainSelect plainSelect) {
179179

180180
deparseDistinctClause(plainSelect, plainSelect.getDistinct());
181181

182+
if (plainSelect.getBigQuerySelectQualifier() != null) {
183+
switch (plainSelect.getBigQuerySelectQualifier()) {
184+
case AS_STRUCT:
185+
buffer.append("AS STRUCT ");
186+
break;
187+
case AS_VALUE:
188+
buffer.append("AS VALUE ");
189+
break;
190+
}
191+
}
192+
182193
Top top = plainSelect.getTop();
183194
if (top != null) {
184195
visit(top);

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

+9
Original file line numberDiff line numberDiff line change
@@ -2395,6 +2395,15 @@ PlainSelect PlainSelect() #PlainSelect:
23952395
)
23962396
]
23972397

2398+
[
2399+
<K_AS>
2400+
(
2401+
<K_STRUCT> { plainSelect.setBigQuerySelectQualifier( PlainSelect.BigQuerySelectQualifier.AS_STRUCT ); }
2402+
|
2403+
<K_VALUE> { plainSelect.setBigQuerySelectQualifier( PlainSelect.BigQuerySelectQualifier.AS_VALUE ); }
2404+
)
2405+
]
2406+
23982407
[ LOOKAHEAD(2) top = Top() { plainSelect.setTop(top); } ]
23992408

24002409
selectItems=SelectItemsList()

src/test/java/net/sf/jsqlparser/statement/select/BigQueryTest.java

+12
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,16 @@ void testAggregateFunctionHaving() throws JSQLParserException {
8080
"SELECT ANY_VALUE(fruit HAVING MAX sold) AS a_highest_selling_fruit FROM Store;\n";
8181
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
8282
}
83+
84+
@Test
85+
void testAsStruct() throws JSQLParserException {
86+
String sqlStr = "SELECT ARRAY(SELECT AS STRUCT 1 a, 2 b)";
87+
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
88+
}
89+
90+
@Test
91+
void testAsValue() throws JSQLParserException {
92+
String sqlStr = "SELECT AS VALUE STRUCT(1 AS a, 2 AS b) xyz";
93+
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
94+
}
8395
}

0 commit comments

Comments
 (0)