diff --git a/src/drivers/sqlite/sql-parse-table.test.ts b/src/drivers/sqlite/sql-parse-table.test.ts index c193905c..52d6d818 100644 --- a/src/drivers/sqlite/sql-parse-table.test.ts +++ b/src/drivers/sqlite/sql-parse-table.test.ts @@ -256,4 +256,32 @@ describe("parse create table", () => { constraints: [], } as DatabaseTableSchema); }); + + test("ignore sql comments inside create table", () => { + const sql = `CREATE TABLE IF NOT EXISTS test1 ( + day TEXT PRIMARY KEY, -- 'yyyy-MM-dd' + total_size INTEGER /* bytes, -- not a line comment */ + -- trailing comment +)`; + + expect(p(sql)).toEqual({ + tableName: "test1", + schemaName: "main", + autoIncrement: false, + pk: ["day"], + columns: [ + { + name: "day", + type: "TEXT", + pk: true, + constraint: { primaryKey: true, autoIncrement: false }, + }, + { + name: "total_size", + type: "INTEGER", + }, + ], + constraints: [], + } as DatabaseTableSchema); + }); }); diff --git a/src/drivers/sqlite/sql-parse-table.ts b/src/drivers/sqlite/sql-parse-table.ts index dea4335d..59333f03 100644 --- a/src/drivers/sqlite/sql-parse-table.ts +++ b/src/drivers/sqlite/sql-parse-table.ts @@ -15,7 +15,11 @@ import { unescapeIdentity } from "./sql-helper"; export class CursorV2 { private ptr: number = 0; - constructor(private tokens: Token[]) { + private tokens: Token[]; + + constructor(tokens: Token[]) { + this.tokens = tokens.filter((t) => t.type !== "COMMENT"); + // Trim whitespace tokens from the beginning and end while (this.tokens.length > 0 && this.tokens[0].type === "WHITESPACE") { this.tokens.shift(); @@ -27,8 +31,6 @@ export class CursorV2 { ) { this.tokens.pop(); } - - this.tokens = tokens; } getPointer() { @@ -563,7 +565,7 @@ export function parseCreateTableScript( cursor.expectTokenOptional("TEMPORARY"); cursor.expectTokenOptional("VIRTUAL"); cursor.expectToken("TABLE"); - cursor.expectTokensOptional(["IF", "NOT", "EXIST"]); + cursor.expectTokensOptional(["IF", "NOT", "EXISTS"]); const tableName = cursor.consumeIdentifier();