Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -19785,14 +19785,23 @@ String AList():
StringBuilder retval = new StringBuilder("(");
Token tk = null;
String name = null;
boolean needsSeparator = false;
}
{
"("

(
( (tk=<S_LONG> | tk=<S_DOUBLE> | tk=<S_CHAR_LITERAL> | tk=<K_TRUE> | tk=<K_FALSE>) { retval.append(tk.image); }
| (name=RelObjectName()) { retval.append(name); })
[("," {retval.append(",");} | "=" {retval.append("=");})] )*
( (tk=<S_LONG> | tk=<S_DOUBLE> | tk=<S_CHAR_LITERAL> | tk=<K_TRUE> | tk=<K_FALSE>) { name = tk.image; }
| name=RelObjectName() )
{
if (needsSeparator) {
retval.append(' ');
}
retval.append(name);
needsSeparator = true;
}
[("," { retval.append(','); needsSeparator = false; }
| "=" { retval.append('='); needsSeparator = false; })] )*

")"
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*-
* #%L
* JSQLParser library
* %%
* Copyright (C) 2004 - 2026 JSQLParser
* %%
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
* #L%
*/
package net.sf.jsqlparser.statement.create;

import static org.junit.jupiter.api.Assertions.assertEquals;

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.AbstractJSqlParser.Dialect;
import net.sf.jsqlparser.parser.CCJSqlParser;
import net.sf.jsqlparser.parser.CCJSqlParserConstants;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.parser.ParseException;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.util.deparser.StatementDeParser;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

class DdlParameterListTest {
@ParameterizedTest
@ValueSource(strings = {
"CREATE VECTOR INDEX items_hnsw ON items (embedding) ORGANIZATION INMEMORY NEIGHBOR GRAPH DISTANCE COSINE WITH TARGET ACCURACY 95 PARAMETERS (TYPE HNSW,NEIGHBORS 32,EFCONSTRUCTION 500)",
"CREATE VECTOR INDEX items_ivf ON items (embedding) ORGANIZATION NEIGHBOR PARTITIONS DISTANCE COSINE WITH TARGET ACCURACY 95 PARAMETERS (TYPE IVF,NEIGHBOR PARTITIONS 10)",
"CREATE TABLE samples (id INT) STORAGE (INITIAL 65536,NEXT 131072)"})
void ddlParametersKeepSeparateWordsAndNumbers(String sql) throws JSQLParserException {
for (Dialect dialect : new Dialect[] {null, Dialect.ORACLE}) {
Statement statement = CCJSqlParserUtil.parse(sql, parser -> {
if (dialect != null) {
parser.withDialect(dialect);
}
});
assertEquals(sql, statement.toString());
StringBuilder output = new StringBuilder();
statement.accept(new StatementDeParser(output), null);
assertEquals(sql, output.toString());
assertEquals(sql, CCJSqlParserUtil.parse(output.toString()).toString());
}
}

@ParameterizedTest
@ValueSource(strings = {"()", "(1,2,3)", "(name=value,count=32)",
"(TYPE HNSW,NEIGHBORS 32,EFCONSTRUCTION 500)",
"(enabled TRUE,ratio 0.5,disabled FALSE)",
"('keep two spaces','comma,equals=','it''s fine')",
"(\"Quoted Name\" 10,\"dotted.name\" 20)"})
void preservesLiteralsQuotedNamesAndExplicitDelimiters(String list) throws ParseException {
CCJSqlParser parser = CCJSqlParserUtil.newParser(list);
assertEquals(list, parser.AList());
assertEquals(CCJSqlParserConstants.EOF, parser.getNextToken().kind);
}
}
Loading