feat: SQL 语法支持 BETWEEN AND、DROP TABLE IF EXISTS
This commit is contained in:
Vendored
+40
-1
@@ -1616,6 +1616,11 @@
|
||||
return this.engine.createTable(createSchema(stmt.name, columns));
|
||||
}
|
||||
async executeDropTable(stmt) {
|
||||
if (stmt.ifExists) {
|
||||
const exists = await this.engine.hasTable(stmt.name);
|
||||
if (!exists)
|
||||
return; // IF EXISTS: 表不存在时静默返回
|
||||
}
|
||||
return this.engine.dropTable(stmt.name);
|
||||
}
|
||||
getEngine() { return this.engine; }
|
||||
@@ -1768,6 +1773,9 @@
|
||||
TokenType["TRUE"] = "TRUE";
|
||||
TokenType["REFERENCES"] = "REFERENCES";
|
||||
TokenType["CASCADE"] = "CASCADE";
|
||||
TokenType["BETWEEN"] = "BETWEEN";
|
||||
TokenType["IF"] = "IF";
|
||||
TokenType["EXISTS"] = "EXISTS";
|
||||
TokenType["FALSE"] = "FALSE";
|
||||
// JOIN 相关
|
||||
TokenType["INNER"] = "INNER";
|
||||
@@ -1844,6 +1852,9 @@
|
||||
'FALSE': TokenType.FALSE,
|
||||
'REFERENCES': TokenType.REFERENCES,
|
||||
'CASCADE': TokenType.CASCADE,
|
||||
'BETWEEN': TokenType.BETWEEN,
|
||||
'IF': TokenType.IF,
|
||||
'EXISTS': TokenType.EXISTS,
|
||||
// JOIN
|
||||
'INNER': TokenType.INNER,
|
||||
'LEFT': TokenType.LEFT,
|
||||
@@ -2453,8 +2464,15 @@
|
||||
parseDropTable() {
|
||||
this.expect(TokenType.DROP);
|
||||
this.expect(TokenType.TABLE);
|
||||
// IF EXISTS(可选)
|
||||
let ifExists = false;
|
||||
if (this.curTokenIs(TokenType.IF)) {
|
||||
this.nextToken();
|
||||
this.expect(TokenType.EXISTS);
|
||||
ifExists = true;
|
||||
}
|
||||
const tableName = this.expectIdentifier('table name');
|
||||
return { type: 'DROP_TABLE', name: tableName };
|
||||
return { type: 'DROP_TABLE', name: tableName, ifExists: ifExists || undefined };
|
||||
}
|
||||
// ===================================================================
|
||||
// 条件表达式
|
||||
@@ -2505,6 +2523,27 @@
|
||||
result[column] = isNot ? { $ne: null } : { $eq: null };
|
||||
return result;
|
||||
}
|
||||
// BETWEEN val1 AND val2
|
||||
if (this.curTokenIs(TokenType.BETWEEN)) {
|
||||
this.nextToken();
|
||||
const low = this.parseValue();
|
||||
this.expect(TokenType.AND);
|
||||
const high = this.parseValue();
|
||||
const result = {};
|
||||
result[column] = { $gte: low, $lte: high };
|
||||
return result;
|
||||
}
|
||||
// NOT BETWEEN val1 AND val2
|
||||
if (this.curTokenIs(TokenType.NOT) && this.peekTokenIs(TokenType.BETWEEN)) {
|
||||
this.nextToken(); // skip NOT
|
||||
this.nextToken(); // skip BETWEEN
|
||||
const low = this.parseValue();
|
||||
this.expect(TokenType.AND);
|
||||
const high = this.parseValue();
|
||||
const result = {};
|
||||
result[column] = { $not: { $gte: low, $lte: high } };
|
||||
return result;
|
||||
}
|
||||
// NOT LIKE / NOT IN(NOT 后紧跟 LIKE 或 IN)
|
||||
if (this.curTokenIs(TokenType.NOT)) {
|
||||
if (this.peekTokenIs(TokenType.IN)) {
|
||||
|
||||
Reference in New Issue
Block a user