mirror of https://github.com/alibaba/druid.git
Compare commits
16 Commits
de24d0baca
...
813da0ffce
| Author | SHA1 | Date |
|---|---|---|
|
|
813da0ffce | |
|
|
9d3135c65b | |
|
|
2e6bb735fb | |
|
|
a179bb9750 | |
|
|
7629916024 | |
|
|
0444f4f532 | |
|
|
ac484261c0 | |
|
|
31177b91f6 | |
|
|
c8b12f0701 | |
|
|
b1fda6d046 | |
|
|
1121b304c2 | |
|
|
a67023f80d | |
|
|
978f805ce3 | |
|
|
9253b6dacc | |
|
|
a6498d1a2c | |
|
|
d7d5d49686 |
|
|
@ -4,7 +4,7 @@
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba</groupId>
|
<groupId>com.alibaba</groupId>
|
||||||
<artifactId>druid-parent</artifactId>
|
<artifactId>druid-parent</artifactId>
|
||||||
<version>1.2.25</version>
|
<version>1.2.26-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>druid</artifactId>
|
<artifactId>druid</artifactId>
|
||||||
|
|
|
||||||
|
|
@ -99,6 +99,7 @@ public enum DbType {
|
||||||
* Alibaba Cloud PolarDB-Oracle 2.0
|
* Alibaba Cloud PolarDB-Oracle 2.0
|
||||||
*/
|
*/
|
||||||
polardb2(1L << 57),
|
polardb2(1L << 57),
|
||||||
|
synapse(1L << 58),
|
||||||
|
|
||||||
ingres(0),
|
ingres(0),
|
||||||
cloudscape(0),
|
cloudscape(0),
|
||||||
|
|
|
||||||
|
|
@ -144,7 +144,8 @@ public class SQLDialect {
|
||||||
public enum Quote {
|
public enum Quote {
|
||||||
SINGLE_QUOTE('\''),
|
SINGLE_QUOTE('\''),
|
||||||
DOUBLE_QUOTE('"'),
|
DOUBLE_QUOTE('"'),
|
||||||
BACK_QUOTE('`');
|
BACK_QUOTE('`'),
|
||||||
|
BRACKETS_QUOTE('[');
|
||||||
public final int mask;
|
public final int mask;
|
||||||
public final char sign;
|
public final char sign;
|
||||||
private Quote(char sign) {
|
private Quote(char sign) {
|
||||||
|
|
@ -157,7 +158,9 @@ public class SQLDialect {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Quote of(char sign) {
|
public static Quote of(char sign) {
|
||||||
if (sign == '\'') {
|
if (sign == '[') {
|
||||||
|
return BRACKETS_QUOTE;
|
||||||
|
} else if (sign == '\'') {
|
||||||
return SINGLE_QUOTE;
|
return SINGLE_QUOTE;
|
||||||
} else if (sign == '"') {
|
} else if (sign == '"') {
|
||||||
return DOUBLE_QUOTE;
|
return DOUBLE_QUOTE;
|
||||||
|
|
@ -180,6 +183,8 @@ public class SQLDialect {
|
||||||
return Quote.SINGLE_QUOTE.sign;
|
return Quote.SINGLE_QUOTE.sign;
|
||||||
} else if ((features & Quote.DOUBLE_QUOTE.mask) != 0) {
|
} else if ((features & Quote.DOUBLE_QUOTE.mask) != 0) {
|
||||||
return Quote.DOUBLE_QUOTE.sign;
|
return Quote.DOUBLE_QUOTE.sign;
|
||||||
|
} else if ((features & Quote.BRACKETS_QUOTE.mask) != 0) {
|
||||||
|
return Quote.BRACKETS_QUOTE.sign;
|
||||||
}
|
}
|
||||||
return ' ';
|
return ' ';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,7 @@ import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerOutputVisitor;
|
||||||
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor;
|
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor;
|
||||||
import com.alibaba.druid.sql.dialect.starrocks.visitor.StarRocksOutputVisitor;
|
import com.alibaba.druid.sql.dialect.starrocks.visitor.StarRocksOutputVisitor;
|
||||||
import com.alibaba.druid.sql.dialect.supersql.visitor.SuperSqlOutputVisitor;
|
import com.alibaba.druid.sql.dialect.supersql.visitor.SuperSqlOutputVisitor;
|
||||||
|
import com.alibaba.druid.sql.dialect.synapse.visitor.SynapseOutputVisitor;
|
||||||
import com.alibaba.druid.sql.dialect.teradata.visitor.TDOutputVisitor;
|
import com.alibaba.druid.sql.dialect.teradata.visitor.TDOutputVisitor;
|
||||||
import com.alibaba.druid.sql.parser.*;
|
import com.alibaba.druid.sql.parser.*;
|
||||||
import com.alibaba.druid.sql.repository.SchemaRepository;
|
import com.alibaba.druid.sql.repository.SchemaRepository;
|
||||||
|
|
@ -554,6 +555,8 @@ public class SQLUtils {
|
||||||
case sqlserver:
|
case sqlserver:
|
||||||
case jtds:
|
case jtds:
|
||||||
return new SQLServerOutputVisitor(out);
|
return new SQLServerOutputVisitor(out);
|
||||||
|
case synapse:
|
||||||
|
return new SynapseOutputVisitor(out);
|
||||||
case db2:
|
case db2:
|
||||||
return new DB2OutputVisitor(out);
|
return new DB2OutputVisitor(out);
|
||||||
case odps:
|
case odps:
|
||||||
|
|
@ -635,6 +638,8 @@ public class SQLUtils {
|
||||||
case sqlserver:
|
case sqlserver:
|
||||||
case jtds:
|
case jtds:
|
||||||
return new SQLServerSchemaStatVisitor(repository);
|
return new SQLServerSchemaStatVisitor(repository);
|
||||||
|
case synapse:
|
||||||
|
return new SQLServerSchemaStatVisitor(repository);
|
||||||
case db2:
|
case db2:
|
||||||
return new DB2SchemaStatVisitor(repository);
|
return new DB2SchemaStatVisitor(repository);
|
||||||
case odps:
|
case odps:
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ public interface SQLObject {
|
||||||
SQLObject clone();
|
SQLObject clone();
|
||||||
|
|
||||||
SQLObject getParent();
|
SQLObject getParent();
|
||||||
|
SQLObject getParent(int level);
|
||||||
|
|
||||||
void setParent(SQLObject parent);
|
void setParent(SQLObject parent);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -108,6 +108,19 @@ public abstract class SQLObjectImpl implements SQLObject {
|
||||||
public SQLObject getParent() {
|
public SQLObject getParent() {
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
public SQLObject getParent(int level) {
|
||||||
|
if (level <= 0) {
|
||||||
|
throw new IllegalArgumentException("Get parent level should be greater than 0.");
|
||||||
|
}
|
||||||
|
SQLObject parent = this;
|
||||||
|
while (level-- > 0) {
|
||||||
|
if (parent == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
parent = parent.getParent();
|
||||||
|
}
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
public void setParent(SQLObject parent) {
|
public void setParent(SQLObject parent) {
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
|
|
|
||||||
|
|
@ -91,6 +91,7 @@ public enum SQLBinaryOperator {
|
||||||
RegExp("REGEXP", 110),
|
RegExp("REGEXP", 110),
|
||||||
NotRegExp("NOT REGEXP", 110),
|
NotRegExp("NOT REGEXP", 110),
|
||||||
Equality("=", 110),
|
Equality("=", 110),
|
||||||
|
EqEq("==", 110),
|
||||||
|
|
||||||
BitwiseNot("!", 130),
|
BitwiseNot("!", 130),
|
||||||
Concat("||", 140),
|
Concat("||", 140),
|
||||||
|
|
@ -99,6 +100,7 @@ public enum SQLBinaryOperator {
|
||||||
BooleanXor("XOR", 150),
|
BooleanXor("XOR", 150),
|
||||||
BooleanOr("OR", 160),
|
BooleanOr("OR", 160),
|
||||||
Assignment(":=", 169),
|
Assignment(":=", 169),
|
||||||
|
Blank("", 170),
|
||||||
|
|
||||||
PG_And("&&", 140),
|
PG_And("&&", 140),
|
||||||
PG_ST_DISTANCE("<->", 20);
|
PG_ST_DISTANCE("<->", 20);
|
||||||
|
|
|
||||||
|
|
@ -42,26 +42,31 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements SQLReplaceable,
|
||||||
protected transient SQLDataType resolvedReturnDataType;
|
protected transient SQLDataType resolvedReturnDataType;
|
||||||
|
|
||||||
public SQLMethodInvokeExpr() {
|
public SQLMethodInvokeExpr() {
|
||||||
|
this.removeBrackets = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SQLMethodInvokeExpr(String methodName) {
|
public SQLMethodInvokeExpr(String methodName) {
|
||||||
this.methodName = methodName;
|
this.methodName = methodName;
|
||||||
|
this.removeBrackets = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SQLMethodInvokeExpr(SQLIdentifierExpr methodName) {
|
public SQLMethodInvokeExpr(SQLIdentifierExpr methodName) {
|
||||||
this.methodName = methodName.name;
|
this.methodName = methodName.name;
|
||||||
this.methodNameHashCode64 = methodName.hashCode64;
|
this.methodNameHashCode64 = methodName.hashCode64;
|
||||||
this.setSource(methodName.getSourceLine(), methodName.getSourceColumn());
|
this.setSource(methodName.getSourceLine(), methodName.getSourceColumn());
|
||||||
|
this.removeBrackets = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SQLMethodInvokeExpr(String methodName, long methodNameHashCode64) {
|
public SQLMethodInvokeExpr(String methodName, long methodNameHashCode64) {
|
||||||
this.methodName = methodName;
|
this.methodName = methodName;
|
||||||
this.methodNameHashCode64 = methodNameHashCode64;
|
this.methodNameHashCode64 = methodNameHashCode64;
|
||||||
|
this.removeBrackets = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SQLMethodInvokeExpr(String methodName, SQLExpr owner) {
|
public SQLMethodInvokeExpr(String methodName, SQLExpr owner) {
|
||||||
this.methodName = methodName;
|
this.methodName = methodName;
|
||||||
setOwner(owner);
|
setOwner(owner);
|
||||||
|
this.removeBrackets = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SQLMethodInvokeExpr(String methodName, SQLExpr owner, SQLExpr... params) {
|
public SQLMethodInvokeExpr(String methodName, SQLExpr owner, SQLExpr... params) {
|
||||||
|
|
@ -70,6 +75,7 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements SQLReplaceable,
|
||||||
for (SQLExpr param : params) {
|
for (SQLExpr param : params) {
|
||||||
this.addArgument(param);
|
this.addArgument(param);
|
||||||
}
|
}
|
||||||
|
this.removeBrackets = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SQLMethodInvokeExpr(String methodName, SQLExpr owner, List<SQLExpr> params) {
|
public SQLMethodInvokeExpr(String methodName, SQLExpr owner, List<SQLExpr> params) {
|
||||||
|
|
@ -78,6 +84,7 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements SQLReplaceable,
|
||||||
for (SQLExpr param : params) {
|
for (SQLExpr param : params) {
|
||||||
this.addArgument(param);
|
this.addArgument(param);
|
||||||
}
|
}
|
||||||
|
this.removeBrackets = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public long methodNameHashCode64() {
|
public long methodNameHashCode64() {
|
||||||
|
|
@ -386,6 +393,7 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements SQLReplaceable,
|
||||||
x.putAttribute(key, value);
|
x.putAttribute(key, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
x.setRemoveBrackets(removeBrackets);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -29,16 +29,30 @@ public class SQLVariantRefExpr extends SQLExprImpl {
|
||||||
|
|
||||||
private boolean global;
|
private boolean global;
|
||||||
private boolean session;
|
private boolean session;
|
||||||
|
private boolean templateParameter;
|
||||||
|
private boolean hasPrefixComma;
|
||||||
|
|
||||||
private int index = -1;
|
private int index = -1;
|
||||||
|
|
||||||
public SQLVariantRefExpr(String name) {
|
public SQLVariantRefExpr(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
if (name.startsWith("${") && name.endsWith("}")) {
|
||||||
|
this.templateParameter = true;
|
||||||
|
} else {
|
||||||
|
this.templateParameter = false;
|
||||||
|
}
|
||||||
|
this.hasPrefixComma = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SQLVariantRefExpr(String name, SQLObject parent) {
|
public SQLVariantRefExpr(String name, SQLObject parent) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
|
if (name.startsWith("${") && name.endsWith("}")) {
|
||||||
|
this.templateParameter = true;
|
||||||
|
} else {
|
||||||
|
this.templateParameter = false;
|
||||||
|
}
|
||||||
|
this.hasPrefixComma = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SQLVariantRefExpr(String name, boolean global) {
|
public SQLVariantRefExpr(String name, boolean global) {
|
||||||
|
|
@ -70,6 +84,22 @@ public class SQLVariantRefExpr extends SQLExprImpl {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isTemplateParameter() {
|
||||||
|
return templateParameter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTemplateParameter(boolean templateParameter) {
|
||||||
|
this.templateParameter = templateParameter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isHasPrefixComma() {
|
||||||
|
return hasPrefixComma;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHasPrefixComma(boolean hasPrefixComma) {
|
||||||
|
this.hasPrefixComma = hasPrefixComma;
|
||||||
|
}
|
||||||
|
|
||||||
public void output(StringBuilder buf) {
|
public void output(StringBuilder buf) {
|
||||||
buf.append(this.name);
|
buf.append(this.name);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ public class CKLexer extends Lexer {
|
||||||
map.put("FINAL", Token.FINAL);
|
map.put("FINAL", Token.FINAL);
|
||||||
map.put("TTL", Token.TTL);
|
map.put("TTL", Token.TTL);
|
||||||
map.put("CODEC", Token.CODEC);
|
map.put("CODEC", Token.CODEC);
|
||||||
|
map.remove("ANY");
|
||||||
|
|
||||||
return new Keywords(map);
|
return new Keywords(map);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,18 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||||
import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
|
import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
|
||||||
import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause;
|
import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause;
|
||||||
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
|
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
|
||||||
|
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
|
||||||
import com.alibaba.druid.sql.ast.statement.SQLWithSubqueryClause;
|
import com.alibaba.druid.sql.ast.statement.SQLWithSubqueryClause;
|
||||||
import com.alibaba.druid.sql.dialect.clickhouse.ast.CKSelectQueryBlock;
|
import com.alibaba.druid.sql.dialect.clickhouse.ast.CKSelectQueryBlock;
|
||||||
import com.alibaba.druid.sql.parser.*;
|
import com.alibaba.druid.sql.parser.Lexer;
|
||||||
|
import com.alibaba.druid.sql.parser.SQLExprParser;
|
||||||
|
import com.alibaba.druid.sql.parser.SQLSelectListCache;
|
||||||
|
import com.alibaba.druid.sql.parser.SQLSelectParser;
|
||||||
|
import com.alibaba.druid.sql.parser.Token;
|
||||||
import com.alibaba.druid.util.FnvHash;
|
import com.alibaba.druid.util.FnvHash;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class CKSelectParser
|
public class CKSelectParser
|
||||||
extends SQLSelectParser {
|
extends SQLSelectParser {
|
||||||
public CKSelectParser(Lexer lexer) {
|
public CKSelectParser(Lexer lexer) {
|
||||||
|
|
@ -85,12 +92,29 @@ public class CKSelectParser
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void parseFrom(SQLSelectQueryBlock queryBlock) {
|
public void parseFrom(SQLSelectQueryBlock queryBlock) {
|
||||||
super.parseFrom(queryBlock);
|
List<String> comments = null;
|
||||||
if (lexer.token() == Token.FINAL) {
|
if (lexer.hasComment() && lexer.isKeepComments()) {
|
||||||
lexer.nextToken();
|
comments = lexer.readAndResetComments();
|
||||||
((CKSelectQueryBlock) queryBlock).setFinal(true);
|
}
|
||||||
|
|
||||||
|
if (lexer.nextIf(Token.FROM)) {
|
||||||
|
SQLTableSource from = parseTableSource();
|
||||||
|
|
||||||
|
if (comments != null) {
|
||||||
|
from.addBeforeComment(comments);
|
||||||
|
}
|
||||||
|
|
||||||
|
queryBlock.setFrom(from);
|
||||||
} else {
|
} else {
|
||||||
((CKSelectQueryBlock) queryBlock).setFinal(false);
|
if (comments != null) {
|
||||||
|
queryBlock.addAfterComment(comments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lexer.nextIf(Token.FINAL)) {
|
||||||
|
if (queryBlock instanceof CKSelectQueryBlock) {
|
||||||
|
((CKSelectQueryBlock) queryBlock).setFinal(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,9 @@ import com.alibaba.druid.sql.dialect.clickhouse.ast.CKCreateTableStatement;
|
||||||
import com.alibaba.druid.sql.dialect.clickhouse.ast.CKSelectQueryBlock;
|
import com.alibaba.druid.sql.dialect.clickhouse.ast.CKSelectQueryBlock;
|
||||||
import com.alibaba.druid.sql.dialect.clickhouse.ast.ClickhouseColumnCodec;
|
import com.alibaba.druid.sql.dialect.clickhouse.ast.ClickhouseColumnCodec;
|
||||||
import com.alibaba.druid.sql.dialect.clickhouse.ast.ClickhouseColumnTTL;
|
import com.alibaba.druid.sql.dialect.clickhouse.ast.ClickhouseColumnTTL;
|
||||||
|
import com.alibaba.druid.sql.parser.CharTypes;
|
||||||
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
|
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
|
||||||
|
import com.alibaba.druid.sql.visitor.VisitorFeature;
|
||||||
import com.alibaba.druid.util.StringUtils;
|
import com.alibaba.druid.util.StringUtils;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -230,6 +232,55 @@ public class CKOutputVisitor extends SQLASTOutputVisitor implements CKASTVisitor
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void printComment(String comment) {
|
||||||
|
if (comment == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isEnabled(VisitorFeature.OutputSkipMultilineComment) && comment.startsWith("/*")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isEnabled(VisitorFeature.OutputSkipSingleLineComment)
|
||||||
|
&& (comment.startsWith("-") || comment.startsWith("#"))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (comment.startsWith("--")
|
||||||
|
&& comment.length() > 2
|
||||||
|
&& comment.charAt(2) != ' '
|
||||||
|
&& comment.charAt(2) != '-') {
|
||||||
|
print0("-- ");
|
||||||
|
print0(comment.substring(2));
|
||||||
|
} else if (comment.startsWith("#")
|
||||||
|
&& comment.length() > 1
|
||||||
|
&& comment.charAt(1) != ' '
|
||||||
|
&& comment.charAt(1) != '#') {
|
||||||
|
print0("# ");
|
||||||
|
print0(comment.substring(1));
|
||||||
|
} else if (comment.startsWith("/*")) {
|
||||||
|
println();
|
||||||
|
print0(comment);
|
||||||
|
} else if (comment.startsWith("--")) {
|
||||||
|
print0(comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
char first = '\0';
|
||||||
|
for (int i = 0; i < comment.length(); i++) {
|
||||||
|
char c = comment.charAt(i);
|
||||||
|
if (CharTypes.isWhitespace(c)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
first = c;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (first == '-' || first == '#') {
|
||||||
|
endLineComment = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void printAfterFetch(SQLSelectQueryBlock queryBlock) {
|
protected void printAfterFetch(SQLSelectQueryBlock queryBlock) {
|
||||||
if (queryBlock instanceof CKSelectQueryBlock) {
|
if (queryBlock instanceof CKSelectQueryBlock) {
|
||||||
|
|
@ -274,6 +325,19 @@ public class CKOutputVisitor extends SQLASTOutputVisitor implements CKASTVisitor
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void printFrom(SQLSelectQueryBlock x) {
|
protected void printFrom(SQLSelectQueryBlock x) {
|
||||||
|
SQLTableSource from = x.getFrom();
|
||||||
|
if (from == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> beforeComments = from.getBeforeCommentsDirect();
|
||||||
|
if (beforeComments != null) {
|
||||||
|
for (String comment : beforeComments) {
|
||||||
|
println();
|
||||||
|
print0(comment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
super.printFrom(x);
|
super.printFrom(x);
|
||||||
if (x instanceof CKSelectQueryBlock && ((CKSelectQueryBlock) x).isFinal()) {
|
if (x instanceof CKSelectQueryBlock && ((CKSelectQueryBlock) x).isFinal()) {
|
||||||
print0(ucase ? " FINAL" : " final");
|
print0(ucase ? " FINAL" : " final");
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,14 @@ package com.alibaba.druid.sql.dialect.hologres.visitor;
|
||||||
import com.alibaba.druid.DbType;
|
import com.alibaba.druid.DbType;
|
||||||
import com.alibaba.druid.sql.ast.SQLPartitionBy;
|
import com.alibaba.druid.sql.ast.SQLPartitionBy;
|
||||||
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
|
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
|
||||||
|
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
|
||||||
|
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
|
||||||
|
import com.alibaba.druid.sql.dialect.clickhouse.ast.CKSelectQueryBlock;
|
||||||
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGOutputVisitor;
|
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGOutputVisitor;
|
||||||
|
import com.alibaba.druid.sql.parser.CharTypes;
|
||||||
|
import com.alibaba.druid.sql.visitor.VisitorFeature;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class HologresOutputVisitor extends PGOutputVisitor {
|
public class HologresOutputVisitor extends PGOutputVisitor {
|
||||||
public HologresOutputVisitor(StringBuilder appender, boolean parameterized) {
|
public HologresOutputVisitor(StringBuilder appender, boolean parameterized) {
|
||||||
|
|
@ -27,4 +34,74 @@ public class HologresOutputVisitor extends PGOutputVisitor {
|
||||||
print0(ucase ? "PARTITION BY " : "partition by ");
|
print0(ucase ? "PARTITION BY " : "partition by ");
|
||||||
partitionBy.accept(this);
|
partitionBy.accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void printFrom(SQLSelectQueryBlock x) {
|
||||||
|
SQLTableSource from = x.getFrom();
|
||||||
|
if (from == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> beforeComments = from.getBeforeCommentsDirect();
|
||||||
|
if (beforeComments != null) {
|
||||||
|
for (String comment : beforeComments) {
|
||||||
|
println();
|
||||||
|
print0(comment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
super.printFrom(x);
|
||||||
|
if (x instanceof CKSelectQueryBlock && ((CKSelectQueryBlock) x).isFinal()) {
|
||||||
|
print0(ucase ? " FINAL" : " final");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void printComment(String comment) {
|
||||||
|
if (comment == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isEnabled(VisitorFeature.OutputSkipMultilineComment) && comment.startsWith("/*")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isEnabled(VisitorFeature.OutputSkipSingleLineComment)
|
||||||
|
&& (comment.startsWith("-") || comment.startsWith("#"))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (comment.startsWith("--")
|
||||||
|
&& comment.length() > 2
|
||||||
|
&& comment.charAt(2) != ' '
|
||||||
|
&& comment.charAt(2) != '-') {
|
||||||
|
print0("-- ");
|
||||||
|
print0(comment.substring(2));
|
||||||
|
} else if (comment.startsWith("#")
|
||||||
|
&& comment.length() > 1
|
||||||
|
&& comment.charAt(1) != ' '
|
||||||
|
&& comment.charAt(1) != '#') {
|
||||||
|
print0("# ");
|
||||||
|
print0(comment.substring(1));
|
||||||
|
} else if (comment.startsWith("/*")) {
|
||||||
|
println();
|
||||||
|
print0(comment);
|
||||||
|
} else if (comment.startsWith("--")) {
|
||||||
|
print0(comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
char first = '\0';
|
||||||
|
for (int i = 0; i < comment.length(); i++) {
|
||||||
|
char c = comment.charAt(i);
|
||||||
|
if (CharTypes.isWhitespace(c)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
first = c;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (first == '-' || first == '#') {
|
||||||
|
endLineComment = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -353,6 +353,9 @@ public class PGExprParser extends SQLExprParser {
|
||||||
} else if (lexer.identifierEquals(FnvHash.Constants.SECOND)) {
|
} else if (lexer.identifierEquals(FnvHash.Constants.SECOND)) {
|
||||||
lexer.nextToken();
|
lexer.nextToken();
|
||||||
intervalExpr.setUnit(SQLIntervalUnit.SECOND);
|
intervalExpr.setUnit(SQLIntervalUnit.SECOND);
|
||||||
|
} else if (lexer.identifierEquals(FnvHash.Constants.WEEK)) {
|
||||||
|
lexer.nextToken();
|
||||||
|
intervalExpr.setUnit(SQLIntervalUnit.WEEK);
|
||||||
}
|
}
|
||||||
|
|
||||||
return intervalExpr;
|
return intervalExpr;
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,8 @@ public class SQLServerInsertStatement extends SQLInsertStatement implements SQLS
|
||||||
public void accept0(SQLASTVisitor v) {
|
public void accept0(SQLASTVisitor v) {
|
||||||
if (v instanceof SQLServerASTVisitor) {
|
if (v instanceof SQLServerASTVisitor) {
|
||||||
accept0((SQLServerASTVisitor) v);
|
accept0((SQLServerASTVisitor) v);
|
||||||
|
} else {
|
||||||
|
super.accept0(v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,8 @@ public class SQLServerUpdateStatement extends SQLUpdateStatement implements SQLS
|
||||||
public void accept0(SQLASTVisitor visitor) {
|
public void accept0(SQLASTVisitor visitor) {
|
||||||
if (visitor instanceof SQLServerASTVisitor) {
|
if (visitor instanceof SQLServerASTVisitor) {
|
||||||
accept0((SQLServerASTVisitor) visitor);
|
accept0((SQLServerASTVisitor) visitor);
|
||||||
|
} else {
|
||||||
|
super.accept0(visitor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -129,7 +129,7 @@ public class SQLServerLexer extends Lexer {
|
||||||
|
|
||||||
if (ch == '/' || ch == '-') {
|
if (ch == '/' || ch == '-') {
|
||||||
scanChar();
|
scanChar();
|
||||||
bufPos++;
|
bufPos = 2;
|
||||||
|
|
||||||
for (; ; ) {
|
for (; ; ) {
|
||||||
if (ch == '\r') {
|
if (ch == '\r') {
|
||||||
|
|
@ -154,7 +154,7 @@ public class SQLServerLexer extends Lexer {
|
||||||
bufPos++;
|
bufPos++;
|
||||||
}
|
}
|
||||||
|
|
||||||
stringVal = subString(mark + 1, bufPos);
|
stringVal = subString(mark, bufPos);
|
||||||
token = Token.LINE_COMMENT;
|
token = Token.LINE_COMMENT;
|
||||||
commentCount++;
|
commentCount++;
|
||||||
if (keepComments) {
|
if (keepComments) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
package com.alibaba.druid.sql.dialect.synapse.ast.stmt;
|
||||||
|
|
||||||
|
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||||
|
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
|
||||||
|
import com.alibaba.druid.sql.dialect.synapse.visitor.SynapseASTVisitor;
|
||||||
|
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class SynapseCreateTableStatement extends SQLCreateTableStatement {
|
||||||
|
private SQLExpr distribution;
|
||||||
|
private List<SQLExpr> clusteredIndexColumns = new ArrayList<>();
|
||||||
|
private boolean isDistributionHash;
|
||||||
|
|
||||||
|
public SynapseCreateTableStatement() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void accept0(SQLASTVisitor visitor) {
|
||||||
|
if (visitor instanceof SynapseASTVisitor) {
|
||||||
|
accept0((SynapseASTVisitor) visitor);
|
||||||
|
} else {
|
||||||
|
super.accept0(visitor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void accept0(SynapseASTVisitor visitor) {
|
||||||
|
if (visitor.visit(this)) {
|
||||||
|
acceptChild(visitor, getTableSource());
|
||||||
|
acceptChild(visitor, getTableElementList());
|
||||||
|
acceptChild(visitor, getInherits());
|
||||||
|
acceptChild(visitor, getSelect());
|
||||||
|
}
|
||||||
|
visitor.endVisit(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SQLExpr getDistribution() {
|
||||||
|
return distribution;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDistribution(SQLExpr distribution) {
|
||||||
|
this.distribution = distribution;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<SQLExpr> getClusteredIndexColumns() {
|
||||||
|
return clusteredIndexColumns;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClusteredIndexColumns(List<SQLExpr> clusteredIndexColumns) {
|
||||||
|
this.clusteredIndexColumns = clusteredIndexColumns;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDistributionHash() {
|
||||||
|
return isDistributionHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDistributionHash(boolean distributionHash) {
|
||||||
|
isDistributionHash = distributionHash;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,93 @@
|
||||||
|
package com.alibaba.druid.sql.dialect.synapse.parser;
|
||||||
|
|
||||||
|
import com.alibaba.druid.DbType;
|
||||||
|
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||||
|
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
|
||||||
|
import com.alibaba.druid.sql.dialect.synapse.ast.stmt.SynapseCreateTableStatement;
|
||||||
|
import com.alibaba.druid.sql.parser.SQLCreateTableParser;
|
||||||
|
import com.alibaba.druid.sql.parser.SQLExprParser;
|
||||||
|
import com.alibaba.druid.sql.parser.Token;
|
||||||
|
|
||||||
|
public class SynapseCreateTableParser extends SQLCreateTableParser {
|
||||||
|
public SynapseCreateTableParser(String sql) {
|
||||||
|
super(sql);
|
||||||
|
this.dbType = DbType.synapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SynapseCreateTableParser(SQLExprParser exprParser) {
|
||||||
|
super(exprParser);
|
||||||
|
this.dbType = DbType.synapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected SynapseCreateTableStatement newCreateStatement() {
|
||||||
|
return new SynapseCreateTableStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void parseCreateTableRest(SQLCreateTableStatement stmt) {
|
||||||
|
if (stmt instanceof SynapseCreateTableStatement) {
|
||||||
|
SynapseCreateTableStatement synapseStmt = (SynapseCreateTableStatement) stmt;
|
||||||
|
|
||||||
|
if (lexer.token() == Token.WITH) {
|
||||||
|
lexer.nextToken();
|
||||||
|
accept(Token.LPAREN);
|
||||||
|
|
||||||
|
parseSynapseWithOptions(synapseStmt);
|
||||||
|
|
||||||
|
accept(Token.RPAREN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
super.parseCreateTableRest(stmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void parseSynapseWithOptions(SynapseCreateTableStatement stmt) {
|
||||||
|
for (;;) {
|
||||||
|
if (lexer.identifierEquals("DISTRIBUTION")) {
|
||||||
|
lexer.nextToken();
|
||||||
|
accept(Token.EQ);
|
||||||
|
|
||||||
|
if (lexer.identifierEquals("HASH")) {
|
||||||
|
lexer.nextToken();
|
||||||
|
accept(Token.LPAREN);
|
||||||
|
SQLExpr distributionColumn = this.exprParser.expr();
|
||||||
|
stmt.setDistribution(distributionColumn);
|
||||||
|
stmt.setDistributionHash(true);
|
||||||
|
accept(Token.RPAREN);
|
||||||
|
} else if (lexer.identifierEquals("ROUND_ROBIN")) {
|
||||||
|
lexer.nextToken();
|
||||||
|
stmt.setDistributionHash(false);
|
||||||
|
} else if (lexer.identifierEquals("REPLICATE")) {
|
||||||
|
lexer.nextToken();
|
||||||
|
stmt.setDistributionHash(false);
|
||||||
|
}
|
||||||
|
} else if (lexer.identifierEquals("CLUSTERED")) {
|
||||||
|
lexer.nextToken();
|
||||||
|
accept(Token.INDEX);
|
||||||
|
accept(Token.LPAREN);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
SQLExpr column = this.exprParser.expr();
|
||||||
|
stmt.getClusteredIndexColumns().add(column);
|
||||||
|
|
||||||
|
if (lexer.token() == Token.COMMA) {
|
||||||
|
lexer.nextToken();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
accept(Token.RPAREN);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lexer.token() == Token.COMMA) {
|
||||||
|
lexer.nextToken();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.alibaba.druid.sql.dialect.synapse.parser;
|
||||||
|
|
||||||
|
import com.alibaba.druid.DbType;
|
||||||
|
import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerExprParser;
|
||||||
|
import com.alibaba.druid.sql.parser.Lexer;
|
||||||
|
import com.alibaba.druid.sql.parser.SQLParserFeature;
|
||||||
|
|
||||||
|
public class SynapseExprParser extends SQLServerExprParser {
|
||||||
|
public SynapseExprParser(String sql, SQLParserFeature... features) {
|
||||||
|
super(sql, features);
|
||||||
|
this.dbType = DbType.synapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SynapseExprParser(Lexer lexer) {
|
||||||
|
super(lexer);
|
||||||
|
this.dbType = DbType.synapse;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
package com.alibaba.druid.sql.dialect.synapse.parser;
|
||||||
|
|
||||||
|
import com.alibaba.druid.DbType;
|
||||||
|
import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerLexer;
|
||||||
|
import com.alibaba.druid.sql.parser.SQLParserFeature;
|
||||||
|
|
||||||
|
public class SynapseLexer extends SQLServerLexer {
|
||||||
|
public SynapseLexer(String input, SQLParserFeature... features) {
|
||||||
|
super(input, features);
|
||||||
|
this.dbType = DbType.synapse;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.alibaba.druid.sql.dialect.synapse.parser;
|
||||||
|
|
||||||
|
import com.alibaba.druid.DbType;
|
||||||
|
import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerSelectParser;
|
||||||
|
import com.alibaba.druid.sql.parser.SQLExprParser;
|
||||||
|
import com.alibaba.druid.sql.parser.SQLSelectListCache;
|
||||||
|
|
||||||
|
public class SynapseSelectParser extends SQLServerSelectParser {
|
||||||
|
public SynapseSelectParser(SQLExprParser exprParser) {
|
||||||
|
super(exprParser);
|
||||||
|
this.dbType = DbType.synapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SynapseSelectParser(SQLExprParser exprParser, SQLSelectListCache selectListCache) {
|
||||||
|
super(exprParser, selectListCache);
|
||||||
|
this.dbType = DbType.synapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SynapseSelectParser(String sql) {
|
||||||
|
super(sql);
|
||||||
|
this.dbType = DbType.synapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected SynapseExprParser createExprParser() {
|
||||||
|
return new SynapseExprParser(this.lexer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
package com.alibaba.druid.sql.dialect.synapse.parser;
|
||||||
|
|
||||||
|
import com.alibaba.druid.DbType;
|
||||||
|
import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser;
|
||||||
|
import com.alibaba.druid.sql.parser.Lexer;
|
||||||
|
import com.alibaba.druid.sql.parser.SQLCreateTableParser;
|
||||||
|
import com.alibaba.druid.sql.parser.SQLParserFeature;
|
||||||
|
import com.alibaba.druid.sql.parser.SQLSelectParser;
|
||||||
|
|
||||||
|
public class SynapseStatementParser extends SQLServerStatementParser {
|
||||||
|
public SynapseStatementParser(String sql) {
|
||||||
|
super(sql);
|
||||||
|
this.dbType = DbType.synapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SynapseStatementParser(String sql, SQLParserFeature... features) {
|
||||||
|
super(sql, features);
|
||||||
|
this.dbType = DbType.synapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SynapseStatementParser(Lexer lexer) {
|
||||||
|
super(lexer);
|
||||||
|
this.dbType = DbType.synapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SQLSelectParser createSQLSelectParser() {
|
||||||
|
return new SynapseSelectParser(this.exprParser, selectListCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SQLCreateTableParser getSQLCreateTableParser() {
|
||||||
|
return new SynapseCreateTableParser(this.exprParser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
package com.alibaba.druid.sql.dialect.synapse.visitor;
|
||||||
|
|
||||||
|
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor;
|
||||||
|
import com.alibaba.druid.sql.dialect.synapse.ast.stmt.SynapseCreateTableStatement;
|
||||||
|
|
||||||
|
public interface SynapseASTVisitor extends SQLServerASTVisitor {
|
||||||
|
default boolean visit(SynapseCreateTableStatement x) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
default void endVisit(SynapseCreateTableStatement x) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
package com.alibaba.druid.sql.dialect.synapse.visitor;
|
||||||
|
|
||||||
|
import com.alibaba.druid.DbType;
|
||||||
|
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerOutputVisitor;
|
||||||
|
import com.alibaba.druid.sql.dialect.synapse.ast.stmt.SynapseCreateTableStatement;
|
||||||
|
|
||||||
|
public class SynapseOutputVisitor extends SQLServerOutputVisitor implements SynapseASTVisitor {
|
||||||
|
public SynapseOutputVisitor(StringBuilder appender) {
|
||||||
|
super(appender);
|
||||||
|
dbType = DbType.synapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SynapseOutputVisitor(StringBuilder appender, boolean parameterized) {
|
||||||
|
super(appender, parameterized);
|
||||||
|
dbType = DbType.synapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean visit(SynapseCreateTableStatement x) {
|
||||||
|
print0(ucase ? "CREATE TABLE " : "create table ");
|
||||||
|
|
||||||
|
if (x.isIfNotExists()) {
|
||||||
|
print0(ucase ? "IF NOT EXISTS " : "if not exists ");
|
||||||
|
}
|
||||||
|
|
||||||
|
printTableSourceExpr(x.getTableSource().getExpr());
|
||||||
|
|
||||||
|
printTableElements(x.getTableElementList());
|
||||||
|
|
||||||
|
if (x.getSelect() != null) {
|
||||||
|
println();
|
||||||
|
print0(ucase ? "AS" : "as");
|
||||||
|
println();
|
||||||
|
x.getSelect().accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2278,7 +2278,7 @@ public class Lexer {
|
||||||
if (ch != ':' && ch != '#' && ch != '$' && !(ch == '@' && dialectFeatureEnabled(ScanVariableAt))) {
|
if (ch != ':' && ch != '#' && ch != '$' && !(ch == '@' && dialectFeatureEnabled(ScanVariableAt))) {
|
||||||
throw new ParserException("illegal variable. " + info());
|
throw new ParserException("illegal variable. " + info());
|
||||||
}
|
}
|
||||||
|
boolean templateParameter = false;
|
||||||
mark = pos;
|
mark = pos;
|
||||||
bufPos = 1;
|
bufPos = 1;
|
||||||
char ch;
|
char ch;
|
||||||
|
|
@ -2296,13 +2296,14 @@ public class Lexer {
|
||||||
boolean ident = false;
|
boolean ident = false;
|
||||||
for (; ; ) {
|
for (; ; ) {
|
||||||
ch = charAt(++pos);
|
ch = charAt(++pos);
|
||||||
if (isEOF() || ch == ';' || ch == ';' || ch == '\r' || ch == '\n') {
|
if (isEOF() || (templateParameter && (ch == ';' || ch == ';' || ch == '\r'))) {
|
||||||
pos--;
|
pos--;
|
||||||
bufPos--;
|
bufPos--;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ch == '}' && !ident) {
|
if (ch == '}' && !ident) {
|
||||||
|
templateParameter = false;
|
||||||
if (isIdentifierChar(charAt(pos + 1))) {
|
if (isIdentifierChar(charAt(pos + 1))) {
|
||||||
bufPos++;
|
bufPos++;
|
||||||
ident = true;
|
ident = true;
|
||||||
|
|
@ -2313,6 +2314,7 @@ public class Lexer {
|
||||||
|
|
||||||
if (ident && ch == '$') {
|
if (ident && ch == '$') {
|
||||||
if (charAt(pos + 1) == '{') {
|
if (charAt(pos + 1) == '{') {
|
||||||
|
templateParameter = true;
|
||||||
bufPos++;
|
bufPos++;
|
||||||
ident = false;
|
ident = false;
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -2323,7 +2325,7 @@ public class Lexer {
|
||||||
if (isWhitespace(ch)) {
|
if (isWhitespace(ch)) {
|
||||||
pos--;
|
pos--;
|
||||||
break;
|
break;
|
||||||
} else if (ch == ',' || ch == ')' || ch == '(' || ch == ';') {
|
} else if (ch == ',' || ch == ')' || ch == '(') {
|
||||||
pos--;
|
pos--;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -2518,17 +2520,25 @@ public class Lexer {
|
||||||
if (ch == '/' && charAt(pos + 1) == '*') {
|
if (ch == '/' && charAt(pos + 1) == '*') {
|
||||||
scanChar();
|
scanChar();
|
||||||
scanChar();
|
scanChar();
|
||||||
if (ch == '!' || ch == '+') {
|
++depth;
|
||||||
scanChar();
|
|
||||||
++depth;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ch == '*' && charAt(pos + 1) == '/') {
|
if (ch == '*' && charAt(pos + 1) == '/') {
|
||||||
scanChar();
|
int curPos = pos;
|
||||||
scanChar();
|
boolean terminated = true;
|
||||||
if (0 == --depth) {
|
// If '*/' has leading '--' in the same line, just skip it. For example '-- xxxx */'.
|
||||||
break;
|
while (curPos > 0 && charAt(curPos) != '\n') {
|
||||||
|
if (charAt(curPos) == '-' && (curPos + 1) < text.length() && charAt(curPos + 1) == '-') {
|
||||||
|
terminated = false;
|
||||||
|
}
|
||||||
|
curPos--;
|
||||||
|
}
|
||||||
|
if (terminated) {
|
||||||
|
scanChar();
|
||||||
|
scanChar();
|
||||||
|
if (0 == --depth) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2927,8 +2927,7 @@ public class SQLExprParser extends SQLParser {
|
||||||
SQLSelectOrderByItem item = parseSelectOrderByItem();
|
SQLSelectOrderByItem item = parseSelectOrderByItem();
|
||||||
item.setParent(parent);
|
item.setParent(parent);
|
||||||
items.add(item);
|
items.add(item);
|
||||||
while (lexer.token == Token.COMMA) {
|
while (lexer.nextIf(Token.COMMA) || (item.getExpr() instanceof SQLVariantRefExpr && lexer.token == IDENTIFIER)) {
|
||||||
lexer.nextToken();
|
|
||||||
item = parseSelectOrderByItem();
|
item = parseSelectOrderByItem();
|
||||||
item.setParent(parent);
|
item.setParent(parent);
|
||||||
items.add(item);
|
items.add(item);
|
||||||
|
|
@ -3532,6 +3531,14 @@ public class SQLExprParser extends SQLParser {
|
||||||
SQLBinaryOperator operator = andRestGetAndOperator();
|
SQLBinaryOperator operator = andRestGetAndOperator();
|
||||||
|
|
||||||
expr = new SQLBinaryOpExpr(expr, operator, rightExp, dbType);
|
expr = new SQLBinaryOpExpr(expr, operator, rightExp, dbType);
|
||||||
|
} else if (token == Token.VARIANT) {
|
||||||
|
String value = lexer.stringVal();
|
||||||
|
lexer.nextToken();
|
||||||
|
SQLExpr variantExpr = new SQLVariantRefExpr(value);
|
||||||
|
if (lexer.token == Token.IN) {
|
||||||
|
variantExpr = inRest(variantExpr);
|
||||||
|
}
|
||||||
|
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Blank, variantExpr, dbType);
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -3619,6 +3626,14 @@ public class SQLExprParser extends SQLParser {
|
||||||
SQLBinaryOperator op = orRestGetOrOperator();
|
SQLBinaryOperator op = orRestGetOrOperator();
|
||||||
|
|
||||||
expr = new SQLBinaryOpExpr(expr, op, rightExp, dbType);
|
expr = new SQLBinaryOpExpr(expr, op, rightExp, dbType);
|
||||||
|
} else if (lexer.token == Token.VARIANT) {
|
||||||
|
String value = lexer.stringVal();
|
||||||
|
lexer.nextToken();
|
||||||
|
SQLExpr variantExpr = new SQLVariantRefExpr(value);
|
||||||
|
if (lexer.token == Token.IN) {
|
||||||
|
variantExpr = inRest(variantExpr);
|
||||||
|
}
|
||||||
|
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Blank, variantExpr, dbType);
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -3642,7 +3657,8 @@ public class SQLExprParser extends SQLParser {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected SQLExpr relationalRestEqeq(SQLExpr expr) {
|
protected SQLExpr relationalRestEqeq(SQLExpr expr) {
|
||||||
return expr;
|
lexer.nextToken();
|
||||||
|
return new SQLBinaryOpExpr(expr, SQLBinaryOperator.EqEq, expr());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected SQLExpr relationalRestTilde(SQLExpr expr) {
|
protected SQLExpr relationalRestTilde(SQLExpr expr) {
|
||||||
|
|
@ -3977,6 +3993,11 @@ public class SQLExprParser extends SQLParser {
|
||||||
return expr;
|
return expr;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case VARIANT:
|
||||||
|
rightExp = new SQLVariantRefExpr(lexer.stringVal);
|
||||||
|
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Blank, rightExp, dbType);
|
||||||
|
lexer.nextToken();
|
||||||
|
return expr;
|
||||||
default:
|
default:
|
||||||
return expr;
|
return expr;
|
||||||
}
|
}
|
||||||
|
|
@ -5946,46 +5967,47 @@ public class SQLExprParser extends SQLParser {
|
||||||
|
|
||||||
String alias;
|
String alias;
|
||||||
List<String> aliasList = null;
|
List<String> aliasList = null;
|
||||||
switch (lexer.token) {
|
if (expr instanceof SQLVariantRefExpr && ((SQLVariantRefExpr) expr).isTemplateParameter() && lexer.token != AS) {
|
||||||
case FULL:
|
alias = null;
|
||||||
case TABLESPACE:
|
} else {
|
||||||
alias = lexer.stringVal();
|
switch (lexer.token) {
|
||||||
lexer.nextToken();
|
case FULL:
|
||||||
break;
|
case TABLESPACE:
|
||||||
case AS:
|
alias = lexer.stringVal();
|
||||||
lexer.nextTokenAlias();
|
|
||||||
if (lexer.token == Token.LITERAL_INT) {
|
|
||||||
alias = '"' + lexer.stringVal() + '"';
|
|
||||||
lexer.nextToken();
|
lexer.nextToken();
|
||||||
} else if (lexer.token == Token.LPAREN) {
|
break;
|
||||||
lexer.nextToken();
|
case AS:
|
||||||
aliasList = new ArrayList<String>();
|
lexer.nextTokenAlias();
|
||||||
|
if (lexer.token == Token.LITERAL_INT) {
|
||||||
for (; ; ) {
|
alias = '"' + lexer.stringVal() + '"';
|
||||||
String stringVal = lexer.stringVal();
|
|
||||||
lexer.nextToken();
|
lexer.nextToken();
|
||||||
|
} else if (lexer.token == Token.LPAREN) {
|
||||||
aliasList.add(stringVal);
|
lexer.nextToken();
|
||||||
|
aliasList = new ArrayList<String>();
|
||||||
if (lexer.token() == Token.COMMA) {
|
for (; ; ) {
|
||||||
|
String stringVal = lexer.stringVal();
|
||||||
lexer.nextToken();
|
lexer.nextToken();
|
||||||
continue;
|
aliasList.add(stringVal);
|
||||||
|
if (lexer.token() == Token.COMMA) {
|
||||||
|
lexer.nextToken();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
accept(Token.RPAREN);
|
||||||
}
|
|
||||||
accept(Token.RPAREN);
|
|
||||||
|
|
||||||
|
alias = null;
|
||||||
|
} else {
|
||||||
|
alias = alias();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EOF:
|
||||||
alias = null;
|
alias = null;
|
||||||
} else {
|
break;
|
||||||
alias = alias();
|
default:
|
||||||
}
|
alias = as();
|
||||||
break;
|
break;
|
||||||
case EOF:
|
}
|
||||||
alias = null;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
alias = as();
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (alias == null && isEnabled(SQLParserFeature.SelectItemGenerateAlias)
|
if (alias == null && isEnabled(SQLParserFeature.SelectItemGenerateAlias)
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,9 @@ import com.alibaba.druid.sql.dialect.starrocks.parser.StarRocksStatementParser;
|
||||||
import com.alibaba.druid.sql.dialect.supersql.parser.SuperSqlExprParser;
|
import com.alibaba.druid.sql.dialect.supersql.parser.SuperSqlExprParser;
|
||||||
import com.alibaba.druid.sql.dialect.supersql.parser.SuperSqlLexer;
|
import com.alibaba.druid.sql.dialect.supersql.parser.SuperSqlLexer;
|
||||||
import com.alibaba.druid.sql.dialect.supersql.parser.SuperSqlStatementParser;
|
import com.alibaba.druid.sql.dialect.supersql.parser.SuperSqlStatementParser;
|
||||||
|
import com.alibaba.druid.sql.dialect.synapse.parser.SynapseExprParser;
|
||||||
|
import com.alibaba.druid.sql.dialect.synapse.parser.SynapseLexer;
|
||||||
|
import com.alibaba.druid.sql.dialect.synapse.parser.SynapseStatementParser;
|
||||||
import com.alibaba.druid.sql.dialect.teradata.parser.TDExprParser;
|
import com.alibaba.druid.sql.dialect.teradata.parser.TDExprParser;
|
||||||
import com.alibaba.druid.sql.dialect.teradata.parser.TDLexer;
|
import com.alibaba.druid.sql.dialect.teradata.parser.TDLexer;
|
||||||
import com.alibaba.druid.sql.dialect.teradata.parser.TDStatementParser;
|
import com.alibaba.druid.sql.dialect.teradata.parser.TDStatementParser;
|
||||||
|
|
@ -180,6 +183,8 @@ public class SQLParserUtils {
|
||||||
case sqlserver:
|
case sqlserver:
|
||||||
case jtds:
|
case jtds:
|
||||||
return new SQLServerStatementParser(sql, features);
|
return new SQLServerStatementParser(sql, features);
|
||||||
|
case synapse:
|
||||||
|
return new SynapseStatementParser(sql, features);
|
||||||
case h2:
|
case h2:
|
||||||
case lealone:
|
case lealone:
|
||||||
return new H2StatementParser(sql, features);
|
return new H2StatementParser(sql, features);
|
||||||
|
|
@ -259,6 +264,8 @@ public class SQLParserUtils {
|
||||||
case sqlserver:
|
case sqlserver:
|
||||||
case jtds:
|
case jtds:
|
||||||
return new SQLServerExprParser(sql, features);
|
return new SQLServerExprParser(sql, features);
|
||||||
|
case synapse:
|
||||||
|
return new SynapseExprParser(sql, features);
|
||||||
case db2:
|
case db2:
|
||||||
return new DB2ExprParser(sql, features);
|
return new DB2ExprParser(sql, features);
|
||||||
case odps:
|
case odps:
|
||||||
|
|
@ -345,6 +352,8 @@ public class SQLParserUtils {
|
||||||
return new SuperSqlLexer(sql, features);
|
return new SuperSqlLexer(sql, features);
|
||||||
case athena:
|
case athena:
|
||||||
return new AthenaLexer(sql, features);
|
return new AthenaLexer(sql, features);
|
||||||
|
case synapse:
|
||||||
|
return new SynapseLexer(sql, features);
|
||||||
case spark:
|
case spark:
|
||||||
return new SparkLexer(sql);
|
return new SparkLexer(sql);
|
||||||
case databricks:
|
case databricks:
|
||||||
|
|
@ -399,6 +408,8 @@ public class SQLParserUtils {
|
||||||
return new OdpsSelectQueryBlock();
|
return new OdpsSelectQueryBlock();
|
||||||
case sqlserver:
|
case sqlserver:
|
||||||
return new SQLServerSelectQueryBlock();
|
return new SQLServerSelectQueryBlock();
|
||||||
|
case synapse:
|
||||||
|
return new SQLServerSelectQueryBlock();
|
||||||
case oscar:
|
case oscar:
|
||||||
return new OscarSelectQueryBlock();
|
return new OscarSelectQueryBlock();
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -756,6 +756,7 @@ public class SQLSelectParser extends SQLParser {
|
||||||
case BANGEQ:
|
case BANGEQ:
|
||||||
case LIKE:
|
case LIKE:
|
||||||
case NOT:
|
case NOT:
|
||||||
|
case VARIANT:
|
||||||
where = this.exprParser.relationalRest(where);
|
where = this.exprParser.relationalRest(where);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
@ -1099,6 +1100,10 @@ public class SQLSelectParser extends SQLParser {
|
||||||
} else {
|
} else {
|
||||||
item = this.exprParser.expr();
|
item = this.exprParser.expr();
|
||||||
}
|
}
|
||||||
|
if (lexer.nextIf(Token.AS)) {
|
||||||
|
item = new SQLAliasedExpr(item, lexer.stringVal);
|
||||||
|
lexer.nextToken();
|
||||||
|
}
|
||||||
|
|
||||||
if (dialectFeatureEnabled(GroupByItemOrder)) {
|
if (dialectFeatureEnabled(GroupByItemOrder)) {
|
||||||
if (lexer.token == Token.DESC) {
|
if (lexer.token == Token.DESC) {
|
||||||
|
|
@ -1122,11 +1127,16 @@ public class SQLSelectParser extends SQLParser {
|
||||||
|
|
||||||
protected void parseSelectList(SQLSelectQueryBlock queryBlock) {
|
protected void parseSelectList(SQLSelectQueryBlock queryBlock) {
|
||||||
final List<SQLSelectItem> selectList = queryBlock.getSelectList();
|
final List<SQLSelectItem> selectList = queryBlock.getSelectList();
|
||||||
|
boolean hasComma = true;
|
||||||
for (; ; ) {
|
for (; ; ) {
|
||||||
final SQLSelectItem selectItem = this.exprParser.parseSelectItem();
|
final SQLSelectItem selectItem = this.exprParser.parseSelectItem();
|
||||||
selectList.add(selectItem);
|
selectList.add(selectItem);
|
||||||
selectItem.setParent(queryBlock);
|
selectItem.setParent(queryBlock);
|
||||||
|
if (!hasComma && selectItem.getExpr() instanceof SQLVariantRefExpr) {
|
||||||
|
SQLVariantRefExpr sqlVariantRefExpr = (SQLVariantRefExpr) selectItem.getExpr();
|
||||||
|
sqlVariantRefExpr.setHasPrefixComma(false);
|
||||||
|
hasComma = true;
|
||||||
|
}
|
||||||
//https://github.com/alibaba/druid/issues/5708
|
//https://github.com/alibaba/druid/issues/5708
|
||||||
if (lexer.hasComment()
|
if (lexer.hasComment()
|
||||||
&& lexer.isKeepComments()
|
&& lexer.isKeepComments()
|
||||||
|
|
@ -1136,7 +1146,14 @@ public class SQLSelectParser extends SQLParser {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lexer.token != Token.COMMA) {
|
if (lexer.token != Token.COMMA) {
|
||||||
break;
|
if (lexer.token == Token.VARIANT) {
|
||||||
|
hasComma = false;
|
||||||
|
continue;
|
||||||
|
} else if (selectItem.getExpr() instanceof SQLVariantRefExpr && ((SQLVariantRefExpr) selectItem.getExpr()).isTemplateParameter() && lexer.token != Token.FROM) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int line = lexer.line;
|
int line = lexer.line;
|
||||||
|
|
|
||||||
|
|
@ -222,11 +222,11 @@ public class SQLStatementParser extends SQLParser {
|
||||||
case SELECT: {
|
case SELECT: {
|
||||||
MySqlHintStatement hintStatement = null;
|
MySqlHintStatement hintStatement = null;
|
||||||
if (i == 1
|
if (i == 1
|
||||||
&& statementList.size() > 0
|
&& !statementList.isEmpty()
|
||||||
&& statementList.get(statementList.size() - i) instanceof MySqlHintStatement) {
|
&& statementList.get(statementList.size() - i) instanceof MySqlHintStatement) {
|
||||||
hintStatement = (MySqlHintStatement) statementList.get(statementList.size() - i);
|
hintStatement = (MySqlHintStatement) statementList.get(statementList.size() - i);
|
||||||
} else if (i > 0 && dialectFeatureEnabled(ParseStatementListSelectUnsupportedSyntax) && !semi
|
} else if (i > 0 && dialectFeatureEnabled(ParseStatementListSelectUnsupportedSyntax) && !semi
|
||||||
&& !(statementList.size() > 0 && statementList.get(statementList.size() - i).isAfterSemi())
|
&& !(!statementList.isEmpty() && statementList.size() - i >= 0 && statementList.get(statementList.size() - i).isAfterSemi())
|
||||||
) {
|
) {
|
||||||
throw new ParserException("syntax error. " + lexer.info());
|
throw new ParserException("syntax error. " + lexer.info());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,7 @@ import com.alibaba.druid.sql.dialect.phoenix.visitor.PhoenixOutputVisitor;
|
||||||
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGOutputVisitor;
|
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGOutputVisitor;
|
||||||
import com.alibaba.druid.sql.dialect.presto.visitor.PrestoOutputVisitor;
|
import com.alibaba.druid.sql.dialect.presto.visitor.PrestoOutputVisitor;
|
||||||
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerOutputVisitor;
|
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerOutputVisitor;
|
||||||
|
import com.alibaba.druid.sql.dialect.synapse.visitor.SynapseOutputVisitor;
|
||||||
import com.alibaba.druid.sql.parser.SQLParserFeature;
|
import com.alibaba.druid.sql.parser.SQLParserFeature;
|
||||||
import com.alibaba.druid.sql.parser.SQLParserUtils;
|
import com.alibaba.druid.sql.parser.SQLParserUtils;
|
||||||
import com.alibaba.druid.sql.parser.SQLSelectListCache;
|
import com.alibaba.druid.sql.parser.SQLSelectListCache;
|
||||||
|
|
@ -434,6 +435,8 @@ public class ParameterizedOutputVisitorUtils {
|
||||||
case sqlserver:
|
case sqlserver:
|
||||||
case jtds:
|
case jtds:
|
||||||
return new SQLServerOutputVisitor(out, true);
|
return new SQLServerOutputVisitor(out, true);
|
||||||
|
case synapse:
|
||||||
|
return new SynapseOutputVisitor(out, true);
|
||||||
case db2:
|
case db2:
|
||||||
return new DB2OutputVisitor(out, true);
|
return new DB2OutputVisitor(out, true);
|
||||||
case phoenix:
|
case phoenix:
|
||||||
|
|
|
||||||
|
|
@ -105,7 +105,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||||
|
|
||||||
protected transient int lines;
|
protected transient int lines;
|
||||||
private TimeZone timeZone;
|
private TimeZone timeZone;
|
||||||
private boolean endLineComment;
|
protected boolean endLineComment;
|
||||||
|
|
||||||
protected SQLDialect dialect;
|
protected SQLDialect dialect;
|
||||||
|
|
||||||
|
|
@ -586,8 +586,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||||
lineItemCount = 0;
|
lineItemCount = 0;
|
||||||
println();
|
println();
|
||||||
}
|
}
|
||||||
|
if (selectItem.getExpr() instanceof SQLVariantRefExpr && !((SQLVariantRefExpr) selectItem.getExpr()).isHasPrefixComma()) {
|
||||||
print0(", ");
|
print0(" ");
|
||||||
|
} else {
|
||||||
|
print0(", ");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selectItem.getClass() == SQLSelectItem.class) {
|
if (selectItem.getClass() == SQLSelectItem.class) {
|
||||||
|
|
@ -1048,7 +1051,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||||
&& ((SQLIdentifierExpr) right).getName().equalsIgnoreCase("NOTFOUND")) {
|
&& ((SQLIdentifierExpr) right).getName().equalsIgnoreCase("NOTFOUND")) {
|
||||||
printOpSpace = false;
|
printOpSpace = false;
|
||||||
}
|
}
|
||||||
if (printOpSpace) {
|
if (printOpSpace && operator != SQLBinaryOperator.Blank) {
|
||||||
print(' ');
|
print(' ');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1569,7 +1572,12 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||||
if (x.isParenthesized()) {
|
if (x.isParenthesized()) {
|
||||||
print('(');
|
print('(');
|
||||||
}
|
}
|
||||||
printName0(x.getName());
|
String replacedName = x.getName();
|
||||||
|
if (x.getParent() instanceof SQLBinaryOpExpr
|
||||||
|
|| x.getParent() instanceof SQLSelectItem) {
|
||||||
|
replacedName = replaceQuota(x.getName());
|
||||||
|
}
|
||||||
|
printName0(replacedName);
|
||||||
if (x.getCollate() != null) {
|
if (x.getCollate() != null) {
|
||||||
String collate = x.getCollate();
|
String collate = x.getCollate();
|
||||||
print(" COLLATE ");
|
print(" COLLATE ");
|
||||||
|
|
@ -3236,9 +3244,15 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||||
if (dialect != null && name.length() >= 2 && dialect.getQuoteChars() != SQLDialect.DEFAULT_QUOTE_INT) {
|
if (dialect != null && name.length() >= 2 && dialect.getQuoteChars() != SQLDialect.DEFAULT_QUOTE_INT) {
|
||||||
if ((name.charAt(0) == '`' && name.charAt(name.length() - 1) == '`')
|
if ((name.charAt(0) == '`' && name.charAt(name.length() - 1) == '`')
|
||||||
|| (name.charAt(0) == '"' && name.charAt(name.length() - 1) == '"')
|
|| (name.charAt(0) == '"' && name.charAt(name.length() - 1) == '"')
|
||||||
|| (name.charAt(0) == '\'' && name.charAt(name.length() - 1) == '\'')) {
|
|| (name.charAt(0) == '\'' && name.charAt(name.length() - 1) == '\'')
|
||||||
|
|| (name.charAt(0) == '[' && name.charAt(name.length() - 1) == ']')) {
|
||||||
if (!SQLDialect.Quote.isValidQuota(dialect.getQuoteChars(), SQLDialect.Quote.of(name.charAt(0)))) {
|
if (!SQLDialect.Quote.isValidQuota(dialect.getQuoteChars(), SQLDialect.Quote.of(name.charAt(0)))) {
|
||||||
name = SQLDialect.Quote.getQuote(dialect.getQuoteChars()) + name.substring(1, name.length() - 1) + SQLDialect.Quote.getQuote(dialect.getQuoteChars());
|
char quote = SQLDialect.Quote.getQuote(dialect.getQuoteChars());
|
||||||
|
if (quote == '[') {
|
||||||
|
name = '[' + name.substring(1, name.length() - 1) + ']';
|
||||||
|
} else {
|
||||||
|
name = quote + name.substring(1, name.length() - 1) + quote;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4921,7 +4935,12 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean visit(SQLInSubQueryExpr x) {
|
public boolean visit(SQLInSubQueryExpr x) {
|
||||||
x.getExpr().accept(this);
|
if (x.getExpr() instanceof SQLIdentifierExpr) {
|
||||||
|
String columnName = replaceQuota(((SQLIdentifierExpr) x.getExpr()).getName());
|
||||||
|
printName0(columnName);
|
||||||
|
} else {
|
||||||
|
x.getExpr().accept(this);
|
||||||
|
}
|
||||||
if (x.isNot()) {
|
if (x.isNot()) {
|
||||||
if (x.isGlobal()) {
|
if (x.isGlobal()) {
|
||||||
print0(ucase ? " GLOBAL NOT IN (" : " global not in (");
|
print0(ucase ? " GLOBAL NOT IN (" : " global not in (");
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
quote=[,"
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
quote=[,"
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
package com.alibaba.druid.bvt.sql;
|
||||||
|
|
||||||
|
import com.alibaba.druid.sql.ast.SQLObject;
|
||||||
|
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class GetParentTest {
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
SQLObject obj1 = new SQLIdentifierExpr("1");
|
||||||
|
SQLObject obj2 = new SQLIdentifierExpr("2");
|
||||||
|
obj2.setParent(obj1);
|
||||||
|
SQLObject obj3 = new SQLIdentifierExpr("3");
|
||||||
|
obj3.setParent(obj2);
|
||||||
|
Assert.assertEquals(obj2, obj3.getParent(1));
|
||||||
|
Assert.assertEquals(obj1, obj3.getParent(2));
|
||||||
|
Assert.assertNull(obj3.getParent(3));
|
||||||
|
Assert.assertNull(obj3.getParent(4));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
package com.alibaba.druid.bvt.sql.synapse;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import com.alibaba.druid.DbType;
|
||||||
|
import com.alibaba.druid.bvt.sql.SQLResourceTest;
|
||||||
|
import com.alibaba.druid.sql.SQLUtils;
|
||||||
|
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||||
|
import com.alibaba.druid.sql.parser.SQLParserUtils;
|
||||||
|
import com.alibaba.druid.sql.parser.SQLStatementParser;
|
||||||
|
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
|
||||||
|
import com.alibaba.druid.util.JdbcUtils;
|
||||||
|
import com.alibaba.druid.util.Utils;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.Reader;
|
||||||
|
import java.util.List;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class SynapseResourceTest extends SQLResourceTest {
|
||||||
|
|
||||||
|
public SynapseResourceTest() {
|
||||||
|
super(DbType.synapse);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void synapse_parse() throws Exception {
|
||||||
|
fileTest(0, 999, i -> "bvt/parser/synapse/" + i + ".txt");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,3 +1,86 @@
|
||||||
|
select
|
||||||
|
/*
|
||||||
|
/*
|
||||||
|
xxx
|
||||||
|
*/
|
||||||
|
*/ a from test
|
||||||
|
--------------------
|
||||||
|
SELECT a
|
||||||
|
FROM test
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
select if(a=='G', b, c) from test
|
||||||
|
--------------------
|
||||||
|
SELECT if(a == 'G', b, c)
|
||||||
|
FROM test
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
select a, b, count(1) from test group by a as c, b as d
|
||||||
|
--------------------
|
||||||
|
SELECT a, b, count(1)
|
||||||
|
FROM test
|
||||||
|
GROUP BY a AS c, b AS d
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
select c from b where c=1 ${if(len(a)=0,'and 1=1',"and a>0")} ${if(len(a)=0,'and 1=1',"and a>0")}
|
||||||
|
--------------------
|
||||||
|
SELECT c
|
||||||
|
FROM b
|
||||||
|
WHERE c = 1 ${if(len(a)=0,'and 1=1',"and a>0")} ${if(len(a)=0,'and 1=1',"and a>0")}
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
select ${if(len(a)=0,' 1=1 ',"c")}, ${if(len(a)=0,' 1=1 ',"c")} from b
|
||||||
|
--------------------
|
||||||
|
SELECT ${if(len(a)=0,' 1=1 ',"c")}, ${if(len(a)=0,' 1=1 ',"c")}
|
||||||
|
FROM b
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
select a from test where 1=1 ${if(a=1, "and b","and c")} in d
|
||||||
|
--------------------
|
||||||
|
SELECT a
|
||||||
|
FROM test
|
||||||
|
WHERE 1 = 1 ${if(a=1, "and b","and c")} IN (d)
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
select a from test where 1=1
|
||||||
|
and (
|
||||||
|
a.report_item_code in ('${gFinReportItem}') or a.report_item_code ='B002'
|
||||||
|
${if(find('E069',gFinReportItem)>0," or (c.yn_offset_report = 'Y' and a.report_item_code ='E06802') "," ")}
|
||||||
|
)
|
||||||
|
--------------------
|
||||||
|
SELECT a
|
||||||
|
FROM test
|
||||||
|
WHERE 1 = 1
|
||||||
|
AND (a.report_item_code IN ('${gFinReportItem}')
|
||||||
|
OR a.report_item_code = 'B002' ${if(find('E069',gFinReportItem)>0," or (c.yn_offset_report = 'Y' and a.report_item_code ='E06802') "," ")})
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
select ${if(len(a)=0,' 1=1 ',"c")}, ${if(len(a)=0,' 1=1 ',"c")} from b
|
||||||
|
--------------------
|
||||||
|
SELECT ${if(len(a)=0,' 1=1 ',"c")}, ${if(len(a)=0,' 1=1 ',"c")}
|
||||||
|
FROM b
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
select b.merge_region_code as region_code,b.merge_region_name as region_name,b.govern_region_area_union as region_area_subtotal
|
||||||
|
${if(gRegionAreaLevel='合并营运区',",b.govern_region_area_union as region_area_code,b.govern_region_area_union as region_area_name",",b.region_area_code as region_area_code,b.region_area_name as region_area_name")}
|
||||||
|
-- ${if(len(gQtrMonth)=5,"/*","")}
|
||||||
|
,sum(case when a.stat_date = ${gQtrMonth} then a.period_loc_amt else 0 end) as bq_amt
|
||||||
|
from b
|
||||||
|
--------------------
|
||||||
|
SELECT b.merge_region_code AS region_code, b.merge_region_name AS region_name, b.govern_region_area_union AS region_area_subtotal ${if(gRegionAreaLevel='合并营运区',",b.govern_region_area_union as region_area_code,b.govern_region_area_union as region_area_name",",b.region_area_code as region_area_code,b.region_area_name as region_area_name")} -- ${if(len(gQtrMonth)=5,"/*","")}
|
||||||
|
, sum(CASE
|
||||||
|
WHEN a.stat_date = ${gQtrMonth} THEN a.period_loc_amt
|
||||||
|
ELSE 0
|
||||||
|
END) AS bq_amt
|
||||||
|
FROM b
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
select
|
||||||
|
${if(gGyzy_hz=='G'," buyer_name as buyer_name, "," syr as buyer_name, ")}
|
||||||
|
substringUTF8(buyer_name,1,positionUTF8(buyer_name,'(')-1) as tg
|
||||||
|
from a
|
||||||
|
--------------------
|
||||||
|
SELECT ${if(gGyzy_hz=='G'," buyer_name as buyer_name, "," syr as buyer_name, ")}
|
||||||
|
, substringUTF8(buyer_name, 1, positionUTF8(buyer_name, '(') - 1) AS tg
|
||||||
|
FROM a
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
select c from b where c=1 ${if(len(a)=0,'and 1=1',"and a>0")} ${if(len(a)=0,'and 1=1',"and a>0")}
|
||||||
|
--------------------
|
||||||
|
SELECT c
|
||||||
|
FROM b
|
||||||
|
WHERE c = 1 ${if(len(a)=0,'and 1=1',"and a>0")} ${if(len(a)=0,'and 1=1',"and a>0")}
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
--test
|
--test
|
||||||
select a from b
|
select a from b
|
||||||
--------------------
|
--------------------
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
this is comment 1
|
||||||
|
this is comment 2
|
||||||
|
*/
|
||||||
|
select 1
|
||||||
|
--------------------
|
||||||
|
/*
|
||||||
|
this is comment 1
|
||||||
|
this is comment 2
|
||||||
|
*/
|
||||||
|
SELECT 1
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
/* this is comment 1 */
|
||||||
|
select 1
|
||||||
|
--------------------
|
||||||
|
/* this is comment 1 */
|
||||||
|
SELECT 1
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
select a /* xxxx
|
||||||
|
xxx
|
||||||
|
xxxx*/ from test
|
||||||
|
--------------------
|
||||||
|
SELECT a
|
||||||
|
/* xxxx
|
||||||
|
xxx
|
||||||
|
xxxx*/
|
||||||
|
FROM test
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
select a /* xxxxxxxx*/ from test
|
||||||
|
--------------------
|
||||||
|
SELECT a
|
||||||
|
/* xxxxxxxx*/
|
||||||
|
FROM test
|
||||||
|
|
@ -1,3 +1,37 @@
|
||||||
|
select cast(($0 + interval $1 week) as date)
|
||||||
|
--------------------
|
||||||
|
SELECT CAST(($0 + INTERVAL '$1' WEEK) AS date)
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
select a from test
|
||||||
|
-- origin
|
||||||
|
-- ${if(gFinPeriod="季度","/*","")}
|
||||||
|
-- origin end
|
||||||
|
-- new
|
||||||
|
/*
|
||||||
|
-- new end
|
||||||
|
where 1=1
|
||||||
|
-- origin
|
||||||
|
-- ${if(gFinPeriod="季度","","*/")}
|
||||||
|
-- origin end
|
||||||
|
-- new
|
||||||
|
*/
|
||||||
|
--new end
|
||||||
|
--------------------
|
||||||
|
SELECT a
|
||||||
|
FROM test -- origin
|
||||||
|
-- ${if(gFinPeriod="季度","/*","")}
|
||||||
|
-- origin end
|
||||||
|
-- new
|
||||||
|
/*
|
||||||
|
-- new end
|
||||||
|
where 1=1
|
||||||
|
-- origin
|
||||||
|
-- ${if(gFinPeriod="季度","","*/")}
|
||||||
|
-- origin end
|
||||||
|
-- new
|
||||||
|
*/
|
||||||
|
-- new end
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
SELECT sum(ret_amount) AS '应收金额'
|
SELECT sum(ret_amount) AS '应收金额'
|
||||||
FROM test.test
|
FROM test.test
|
||||||
GROUP BY a ORDER BY '应收金额' DESC;
|
GROUP BY a ORDER BY '应收金额' DESC;
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,33 @@
|
||||||
|
select * from [test].[test] where [a] in (select [c] from [test])
|
||||||
|
--------------------
|
||||||
|
SELECT *
|
||||||
|
FROM [test].[test]
|
||||||
|
WHERE [a] IN (
|
||||||
|
SELECT [c]
|
||||||
|
FROM [test]
|
||||||
|
)
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
select * from [test].[test]
|
||||||
|
--------------------
|
||||||
|
SELECT *
|
||||||
|
FROM [test].[test]
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
CREATE VIEW [a].[b]
|
||||||
|
AS SELECT
|
||||||
|
*
|
||||||
|
, [c] = DATEDIFF(MILLISECOND, request_time, GETDATE()) / 1000.0
|
||||||
|
FROM
|
||||||
|
tbl
|
||||||
|
WHERE
|
||||||
|
[state] = 'Queued';
|
||||||
|
--------------------
|
||||||
|
CREATE VIEW [a].[b]
|
||||||
|
AS
|
||||||
|
SELECT *
|
||||||
|
, [c] = DATEDIFF(MILLISECOND, request_time, GETDATE()) / 1000.0
|
||||||
|
FROM tbl
|
||||||
|
WHERE [state] = 'Queued';
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
USE AdventureWorks2008R2
|
USE AdventureWorks2008R2
|
||||||
--------------------
|
--------------------
|
||||||
USE AdventureWorks2008R2
|
USE AdventureWorks2008R2
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
SELECT TOP 10 * FROM users WHERE id > 100
|
||||||
|
--------------------
|
||||||
|
SELECT TOP 10 *
|
||||||
|
FROM users
|
||||||
|
WHERE id > 100
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
SELECT [column name] FROM [table name] WHERE [id] = 1
|
||||||
|
--------------------
|
||||||
|
SELECT [column name]
|
||||||
|
FROM [table name]
|
||||||
|
WHERE [id] = 1
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
SELECT *
|
||||||
|
FROM (
|
||||||
|
SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn
|
||||||
|
FROM users
|
||||||
|
) t
|
||||||
|
WHERE t.rn BETWEEN 1 AND 10
|
||||||
|
--------------------
|
||||||
|
SELECT *
|
||||||
|
FROM (
|
||||||
|
SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn
|
||||||
|
FROM users
|
||||||
|
) t
|
||||||
|
WHERE t.rn BETWEEN 1 AND 10
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
EXEC sp_procedure_name @param1 = 'value1', @param2 = 2
|
||||||
|
--------------------
|
||||||
|
EXEC sp_procedure_name @param1 = 'value1', @param2 = 2
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
CREATE TABLE ads_crm.tmp_summary_trans_base
|
||||||
|
WITH (DISTRIBUTION = HASH(user_id),
|
||||||
|
CLUSTERED INDEX (idx_col))
|
||||||
|
AS
|
||||||
|
SELECT * FROM source
|
||||||
|
--------------------
|
||||||
|
CREATE TABLE ads_crm.tmp_summary_trans_base
|
||||||
|
AS
|
||||||
|
SELECT *
|
||||||
|
FROM source
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
CREATE TABLE users (
|
||||||
|
id INT IDENTITY(1,1) PRIMARY KEY,
|
||||||
|
name NVARCHAR(100) NOT NULL,
|
||||||
|
email VARCHAR(255),
|
||||||
|
created_date DATETIME2 DEFAULT GETDATE()
|
||||||
|
)
|
||||||
|
--------------------
|
||||||
|
CREATE TABLE users (
|
||||||
|
id INT PRIMARY KEY IDENTITY (1, 1),
|
||||||
|
name NVARCHAR(100) NOT NULL,
|
||||||
|
email VARCHAR(255),
|
||||||
|
created_date DATETIME2 DEFAULT GETDATE()
|
||||||
|
)
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
UPDATE users
|
||||||
|
SET name = 'Updated Name',
|
||||||
|
email = 'new@email.com'
|
||||||
|
OUTPUT INSERTED.id, INSERTED.name
|
||||||
|
WHERE id = 1
|
||||||
|
--------------------
|
||||||
|
UPDATE users
|
||||||
|
SET name = 'Updated Name', email = 'new@email.com'
|
||||||
|
OUTPUT INSERTED.id, INSERTED.name
|
||||||
|
WHERE id = 1
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
WITH CTE AS (
|
||||||
|
SELECT id, name, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id) as rn
|
||||||
|
FROM users
|
||||||
|
)
|
||||||
|
SELECT * FROM CTE WHERE rn = 1
|
||||||
|
--------------------
|
||||||
|
WITH CTE AS (
|
||||||
|
SELECT id, name, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id) AS rn
|
||||||
|
FROM users
|
||||||
|
)
|
||||||
|
SELECT *
|
||||||
|
FROM CTE
|
||||||
|
WHERE rn = 1
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
INSERT INTO users (name, email)
|
||||||
|
OUTPUT INSERTED.id, INSERTED.name
|
||||||
|
VALUES ('John Doe', 'john@example.com')
|
||||||
|
--------------------
|
||||||
|
INSERT INTO users (name, email)
|
||||||
|
OUTPUT INSERTED.id, INSERTED.name
|
||||||
|
VALUES ('John Doe', 'john@example.com')
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
CREATE TABLE ads_crm.tmp_summary_trans_base
|
||||||
|
WITH (DISTRIBUTION = HASH(user_id),
|
||||||
|
CLUSTERED INDEX (idx_col))
|
||||||
|
AS
|
||||||
|
SELECT * FROM source
|
||||||
|
--------------------
|
||||||
|
CREATE TABLE ads_crm.tmp_summary_trans_base
|
||||||
|
AS
|
||||||
|
SELECT *
|
||||||
|
FROM source
|
||||||
|
|
@ -34,7 +34,7 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alibaba</groupId>
|
<groupId>com.alibaba</groupId>
|
||||||
<artifactId>druid-spring-boot-starter</artifactId>
|
<artifactId>druid-spring-boot-starter</artifactId>
|
||||||
<version>1.2.25</version>
|
<version>1.2.26-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- Spring and Spring Boot dependencies -->
|
<!-- Spring and Spring Boot dependencies -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba</groupId>
|
<groupId>com.alibaba</groupId>
|
||||||
<artifactId>druid-parent</artifactId>
|
<artifactId>druid-parent</artifactId>
|
||||||
<version>1.2.25</version>
|
<version>1.2.26-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>druid-spring-boot-3-starter</artifactId>
|
<artifactId>druid-spring-boot-3-starter</artifactId>
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba</groupId>
|
<groupId>com.alibaba</groupId>
|
||||||
<artifactId>druid-parent</artifactId>
|
<artifactId>druid-parent</artifactId>
|
||||||
<version>1.2.25</version>
|
<version>1.2.26-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>druid-spring-boot-starter</artifactId>
|
<artifactId>druid-spring-boot-starter</artifactId>
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba</groupId>
|
<groupId>com.alibaba</groupId>
|
||||||
<artifactId>druid-parent</artifactId>
|
<artifactId>druid-parent</artifactId>
|
||||||
<version>1.2.25</version>
|
<version>1.2.26-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.alibaba</groupId>
|
<groupId>com.alibaba</groupId>
|
||||||
|
|
|
||||||
14
pom.xml
14
pom.xml
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
<groupId>com.alibaba</groupId>
|
<groupId>com.alibaba</groupId>
|
||||||
<artifactId>druid-parent</artifactId>
|
<artifactId>druid-parent</artifactId>
|
||||||
<version>1.2.25</version>
|
<version>1.2.26-SNAPSHOT</version>
|
||||||
<name>${project.artifactId}</name>
|
<name>${project.artifactId}</name>
|
||||||
<description>A JDBC datasource implementation.</description>
|
<description>A JDBC datasource implementation.</description>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
@ -81,12 +81,12 @@
|
||||||
|
|
||||||
<distributionManagement>
|
<distributionManagement>
|
||||||
<repository>
|
<repository>
|
||||||
<id>ossrh</id>
|
<id>central</id>
|
||||||
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
|
<url>https://central.sonatype.org/service/local/staging/deploy/maven2/</url>
|
||||||
</repository>
|
</repository>
|
||||||
<snapshotRepository>
|
<snapshotRepository>
|
||||||
<id>ossrh</id>
|
<id>central</id>
|
||||||
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
|
<url>https://central.sonatype.com/repository/maven-snapshots/</url>
|
||||||
</snapshotRepository>
|
</snapshotRepository>
|
||||||
</distributionManagement>
|
</distributionManagement>
|
||||||
|
|
||||||
|
|
@ -470,8 +470,8 @@
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
<configuration>
|
<configuration>
|
||||||
<serverId>ossrh</serverId>
|
<serverId>central</serverId>
|
||||||
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
|
<nexusUrl>https://central.sonatype.org/</nexusUrl>
|
||||||
<autoReleaseAfterClose>true</autoReleaseAfterClose>
|
<autoReleaseAfterClose>true</autoReleaseAfterClose>
|
||||||
<!--
|
<!--
|
||||||
If you are deploying to Maven Central,
|
If you are deploying to Maven Central,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue