From eaf3af6e1443bcb95023a8da0889190b6a9f6233 Mon Sep 17 00:00:00 2001 From: Philippe Hebert Date: Thu, 12 Dec 2019 17:09:40 -0500 Subject: [PATCH 1/2] fix(SqliteDriver.js): Fixed table schema parsing #1 .match on line 52 returned null => fixed by removing the EOL character #2 The describe table returns the name of the field between square brackets => fixed by removing the square brackets --- packages/cubejs-sqlite-driver/driver/SqliteDriver.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/cubejs-sqlite-driver/driver/SqliteDriver.js b/packages/cubejs-sqlite-driver/driver/SqliteDriver.js index 858c232222882..71fc2bf4b49cf 100644 --- a/packages/cubejs-sqlite-driver/driver/SqliteDriver.js +++ b/packages/cubejs-sqlite-driver/driver/SqliteDriver.js @@ -49,9 +49,11 @@ class SqliteDriver extends BaseDriver { default: { ...(tables.map( table => ({ - [table.name]: table.sql.match(/\((.*)\)/)[1].split(',') - .map(nameAndType => nameAndType.trim().split(' ')).map(([name, type]) => ({ name, type })) + [table.name]: table.sql.replace(/\n/g, '').match(/\((.*)\)/)[1].split(',') + .map(nameAndType => nameAndType.trim().split(' ')).map(([name, type]) => ({ name: name.splice(1, -1), type })) }) + + )).reduce((a, b) => ({ ...a, ...b }), {}) } }; From 58ae3e011e5d8ab82b0e6f475191b58e3967c6cc Mon Sep 17 00:00:00 2001 From: Philippe Hebert Date: Fri, 13 Dec 2019 07:54:24 -0500 Subject: [PATCH 2/2] Added support for all escape symbols ((\[|`|")?) Fix now supports all escape symbols and absence of escape symbol. + Refactored the `tables.map.reduce` to `tables.reduce` instead. --- .../driver/SqliteDriver.js | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/packages/cubejs-sqlite-driver/driver/SqliteDriver.js b/packages/cubejs-sqlite-driver/driver/SqliteDriver.js index 71fc2bf4b49cf..516d106b44eec 100644 --- a/packages/cubejs-sqlite-driver/driver/SqliteDriver.js +++ b/packages/cubejs-sqlite-driver/driver/SqliteDriver.js @@ -46,16 +46,23 @@ class SqliteDriver extends BaseDriver { const tables = await this.query(query); return { - default: { - ...(tables.map( - table => ({ - [table.name]: table.sql.replace(/\n/g, '').match(/\((.*)\)/)[1].split(',') - .map(nameAndType => nameAndType.trim().split(' ')).map(([name, type]) => ({ name: name.splice(1, -1), type })) - }) - - - )).reduce((a, b) => ({ ...a, ...b }), {}) - } + default: tables.reduce((acc, table) => ({ + ...acc, + [table.name]: table.sql + // remove EOL for next .match to read full string + .replace(/\n/g, '') + // extract fields + .match(/\((.*)\)/)[1] + // split fields + .split(',') + .map((nameAndType) => { + const match = nameAndType + .trim() + // obtain "([|`|")?name(]|`|")? type" + .match(/(\[|`|")?([^\[\]"`]+)(\]|`|")?\s+(\w+)/) + return { name: match[2], type: match[4] }; + }) + }), {}), }; } }