Back to Druid

SQL 方言支持 | SQL Dialect Support

doc/sql-dialect-support.md

1.2.285.3 KB
Original Source

SQL 方言支持 | SQL Dialect Support

English | 中文


中文

Druid SQL 解析器当前支持 30 种数据库方言。每种方言都提供完整的 Lexer(词法分析器)、Parser(语法分析器)、AST(抽象语法树节点)和 Visitor(访问者)实现。

方言支持矩阵

方言DbTypeLexerParserOutputVisitorSchemaStatVisitorWallProvider
MySQLmysqlYYYYY
PostgreSQLpostgresqlYYYYY
OracleoracleYYYYY
SQL ServersqlserverYYYYY
DB2db2YYYYY
H2h2YYYY-
InformixinformixYYYY-
达梦 (DM)dmYYYY-
OscaroscarYYYY-
GaussDBgaussdbYYYY-
ClickHouseclickhouseYYYY-
DorisdorisYYYY-
StarRocksstarrocksYYYY-
TeradatateradataYYYY-
RedshiftredshiftYYYY-
BigQuerybigqueryYYYY-
SnowflakesnowflakeYYYY-
SynapsesynapseYYYY-
HologreshologresYYYY-
ODPS (MaxCompute)odpsYYYY-
HivehiveYYYY-
SparksparkYYYY-
PrestoprestoYYYY-
ImpalaimpalaYYYY-
AthenaathenaYYYY-
BlinkblinkYYYY-
DatabricksdatabricksYYYY-
PhoenixphoenixYYYY-
SuperSQLsupersqlYYYY-
Transact-SQLtransactYYYY-

各方言特性

MySQL

  • 全面支持 MySQL 5.x / 8.x 语法
  • SHOWDESCRIBEEXPLAIN 等管理语句
  • ON DUPLICATE KEY UPDATE INSERT 冲突处理
  • LIMIT offset, count 分页语法
  • FORCE INDEXUSE INDEX 索引提示
  • MySQL 特有函数(GROUP_CONCATJSON_EXTRACT 等)

PostgreSQL

  • 支持 PostgreSQL 10+ 语法
  • RETURNING 子句
  • ON CONFLICT (UPSERT) 语法
  • LIMIT ... OFFSET 分页
  • 数组类型和操作符
  • COPY 语句
  • Window Functions 完整支持

Oracle

  • PL/SQL 块解析
  • CONNECT BY 层次查询
  • ROWNUM 伪列
  • MERGE INTO 语句
  • FLASHBACK 查询
  • Package Body 解析

SQL Server

  • T-SQL 语法支持
  • TOP 限制
  • WITH (NOLOCK) 提示
  • CTE(WITH ... AS
  • CROSS APPLY / OUTER APPLY
  • ALTER PROCEDUREALTER VIEW

达梦 (DM)

  • 兼容 Oracle 语法特性
  • CONNECT BY 层次查询
  • DM 特有系统函数
  • PL/SQL 兼容语法

ClickHouse

  • ENGINE = MergeTree() 等建表引擎
  • PARTITION BY 分区语法
  • SAMPLE 采样查询
  • ClickHouse 特有函数

BigQuery

  • EXPORT DATA 语句
  • STRUCTARRAY 类型
  • 反引号标识符(`
  • BigQuery 特有函数

使用方法

java
import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.SQLUtils;

// 指定方言解析
List<SQLStatement> stmts = SQLUtils.parseStatements(sql, DbType.mysql);

// 指定方言格式化
String formatted = SQLUtils.format(sql, DbType.postgresql);

// 指定方言创建 Schema 统计
SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(DbType.oracle);

方言注册机制

每种方言通过 META-INF/druid/parser/<dialect>/ 下的配置文件注册:

META-INF/druid/parser/<dialect>/
├── dialect.properties    # 方言属性配置(引号字符等)
└── builtin_datatypes     # 内置数据类型列表

dialect.properties 示例:

properties
# 引号字符
quoteChars=`,",[

builtin_datatypes 示例:

INTEGER
VARCHAR
TEXT
BLOB
REAL

添加新方言

参见 贡献指南 了解如何添加新的 SQL 方言支持。


English

The Druid SQL parser currently supports 30 database dialects. Each dialect provides complete Lexer, Parser, AST and Visitor implementations.

Dialect Support Matrix

See the Chinese section above for the complete support matrix table.

Usage

java
import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.SQLUtils;

// Parse with specific dialect
List<SQLStatement> stmts = SQLUtils.parseStatements(sql, DbType.mysql);

// Format with specific dialect
String formatted = SQLUtils.format(sql, DbType.postgresql);

// Create dialect-specific schema visitor
SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(DbType.oracle);

Per-Dialect Highlights

  • MySQL — Full 5.x/8.x support including SHOW, LIMIT, index hints, JSON functions
  • PostgreSQLRETURNING, ON CONFLICT, array types, COPY, window functions
  • Oracle — PL/SQL, CONNECT BY, MERGE INTO, FLASHBACK, package bodies
  • SQL Server — T-SQL, TOP, WITH (NOLOCK), CROSS APPLY, CTEs
  • ClickHouse — Table engines, PARTITION BY, SAMPLE, ClickHouse functions
  • BigQueryEXPORT DATA, STRUCT/ARRAY types, backtick identifiers

Dialect Registration

Each dialect registers via configuration files in META-INF/druid/parser/<dialect>/:

  • dialect.properties — Dialect properties (quote characters, etc.)
  • builtin_datatypes — Built-in data type list