Compare commits

...

3 Commits

Author SHA1 Message Date
shark 12b258b859
Merge 0736876199 into 1121b304c2 2025-07-07 06:10:55 -07:00
Muhong_Yang 1121b304c2
fix quote parsing in columns (#6471)
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (11, ubuntu-latest) (push) Has been cancelled Details
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (17, ubuntu-latest) (push) Has been cancelled Details
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (21, ubuntu-latest) (push) Has been cancelled Details
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (8, ubuntu-latest) (push) Has been cancelled Details
* add dbtype adb_mysql

* Presto/Trino parser fix

* add CTE visit for insertNode

* add keyword config for spark/hive

* support synapse parser

* support synapse parser

* lexer fix: comment character missing

* lexer fix: comment character missing

* fix quote parsing in columns
2025-07-05 00:47:01 +08:00
刘强 0736876199 Fix solve the issue in SQL where the < operator is mistakenly recognized as <@ when used jointly with user-defined variables. 2025-05-07 13:48:34 +08:00
4 changed files with 79 additions and 5 deletions

View File

@ -1677,10 +1677,6 @@ public class Lexer {
scanChar();
scanChar();
token = Token.LTLT;
} else if (c1 == '@') {
scanChar();
scanChar();
token = Token.LT_MONKEYS_AT;
} else if (c1 == '-' && charAt(pos + 2) == '>') {
scanChar();
scanChar();

View File

@ -1569,7 +1569,12 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
if (x.isParenthesized()) {
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) {
String collate = x.getCollate();
print(" COLLATE ");

View File

@ -3,16 +3,23 @@ package com.alibaba.druid.mysql;
import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.SQLSetStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetTransactionStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.util.JdbcConstants;
import org.junit.Assert;
import org.junit.Test;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.BinaryOperator;
/**
* Created by szf on 2017/11/16.
@ -150,4 +157,54 @@ public class MysqlVarantRefTest {
Assert.assertTrue(resultExpr5.isSession());
}
@Test
public void test7() {
// in this case, < @sid is recognized as < operator and user-defined variables@sid
String sql = "set @sid=1;select * from aaa where id < @sid; ";
SQLStatementParser parser = new MySqlStatementParser(sql);
List<SQLStatement> stmtList = parser.parseStatementList();
SQLSetStatement result0 = (SQLSetStatement) stmtList.get(0);
SQLVariantRefExpr resultExpr0 = (SQLVariantRefExpr) result0.getItems().get(0).getTarget();
Assert.assertEquals("@sid", resultExpr0.getName());
AtomicReference<SQLVariantRefExpr> resultExpr1Ref = new AtomicReference<>();
AtomicInteger variableCnt = new AtomicInteger(0);
AtomicInteger arrayContainerByOperatorCnt = new AtomicInteger(0);
MySqlASTVisitor visitor = new MySqlASTVisitorAdapter() {
@Override
public boolean visit(SQLVariantRefExpr x) {
resultExpr1Ref.set(x);
variableCnt.addAndGet(1);
return super.visit(x);
}
@Override
public boolean visit(SQLBinaryOpExpr x) {
if(SQLBinaryOperator.Array_ContainedBy.equals(x.getOperator())) {
arrayContainerByOperatorCnt.addAndGet(1);
}
return super.visit(x);
}
};
stmtList.get(1).accept(visitor);
Assert.assertEquals(1, variableCnt.get());
Assert.assertEquals(0, arrayContainerByOperatorCnt.get());
Assert.assertEquals("@sid", resultExpr1Ref.get().getName());
// in this case, <@ is recognized as <@, instead of < user-defined variables@sid
String sql2 = "select * from aaa where id <@ sid; ";
SQLStatementParser parser2 = new MySqlStatementParser(sql2);
List<SQLStatement> stmtList2 = parser2.parseStatementList();
variableCnt.set(0);
arrayContainerByOperatorCnt.set(0);
resultExpr1Ref.set(null);
stmtList2.get(0).accept(visitor);
Assert.assertEquals(0, variableCnt.get());
Assert.assertEquals(1, arrayContainerByOperatorCnt.get());
Assert.assertNull(resultExpr1Ref.get());
}
}

View File

@ -12,6 +12,22 @@ 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