diff --git a/src/components/TableDescription.vue b/src/components/TableDescription.vue index 14573b8..755f433 100644 --- a/src/components/TableDescription.vue +++ b/src/components/TableDescription.vue @@ -39,14 +39,28 @@ export default { }, computed: { ast () { - return sqliteParser(this.sql) + // There is a bug is sqlite-parser + // It throws an error if tokenizer has an arguments: + // https://github.com/codeschool/sqlite-parser/issues/59 + const fixedSql = this.sql + .replace(/(?<=tokenize=.+)"tokenchars=.+"/, '') + .replace(/(?<=tokenize=.+)"remove_diacritics=.+"/, '') + .replace(/(?<=tokenize=.+)"separators=.+"/, '') + .replace(/tokenize=.+(?=(,|\)))/, 'tokenize=unicode61') + + return sqliteParser(fixedSql) }, columns () { const columns = [] - this.ast.statement[0].definition.forEach(item => { - if (item.variant === 'column') { - let type = item.datatype.variant - if (item.datatype.args) { + + const columnDefinition = this.ast.statement[0].format === 'table' + ? this.ast.statement[0].definition + : this.ast.statement[0].result.args.expression // virtual table + + columnDefinition.forEach(item => { + if (item.variant === 'column' && ['identifier', 'definition'].includes(item.type)) { + let type = item.datatype ? item.datatype.variant : 'N/A' + if (item.datatype && item.datatype.args) { type = type + '(' + item.datatype.args.expression[0].value if (item.datatype.args.expression.length === 2) { type = type + ', ' + item.datatype.args.expression[1].value @@ -61,6 +75,7 @@ export default { } } +