feat: SQL 语法支持 CREATE TABLE IF NOT EXISTS
- Parser 支持 CREATE TABLE IF NOT EXISTS 语法 - AST CreateTableStatement 新增 ifNotExists 字段 - Executor 表已存在时静默跳过 - 修复 demo.html Aria 预设报错
This commit is contained in:
Vendored
+15
-1
@@ -3997,6 +3997,12 @@ class QueryExecutor {
|
||||
return this.engine.delete(plan.table, plan);
|
||||
}
|
||||
async executeCreateTable(stmt) {
|
||||
// IF NOT EXISTS: 表已存在时静默返回
|
||||
if (stmt.ifNotExists) {
|
||||
const exists = await this.engine.hasTable(stmt.name);
|
||||
if (exists)
|
||||
return;
|
||||
}
|
||||
const columns = {};
|
||||
for (const col of stmt.columns)
|
||||
columns[col.name] = astColumnToColumnDef(col);
|
||||
@@ -4759,6 +4765,14 @@ class Parser {
|
||||
parseCreateTable() {
|
||||
this.expect(TokenType.CREATE);
|
||||
this.expect(TokenType.TABLE);
|
||||
// IF NOT EXISTS(可选)
|
||||
let ifNotExists = false;
|
||||
if (this.curTokenIs(TokenType.IF)) {
|
||||
this.nextToken();
|
||||
this.expect(TokenType.NOT);
|
||||
this.expect(TokenType.EXISTS);
|
||||
ifNotExists = true;
|
||||
}
|
||||
const tableName = this.expectIdentifier('table name');
|
||||
this.expect(TokenType.LPAREN);
|
||||
const columns = [];
|
||||
@@ -4768,7 +4782,7 @@ class Parser {
|
||||
columns.push(this.parseColumnDef());
|
||||
} while (this.curTokenIs(TokenType.COMMA));
|
||||
this.expect(TokenType.RPAREN);
|
||||
return { type: 'CREATE_TABLE', name: tableName, columns };
|
||||
return { type: 'CREATE_TABLE', name: tableName, columns, ifNotExists: ifNotExists || undefined };
|
||||
}
|
||||
parseColumnDef() {
|
||||
const name = this.expectIdentifier('column name');
|
||||
|
||||
Reference in New Issue
Block a user