taozhi8833998 / node-sql-parser

Parse simple SQL statements into an abstract syntax tree (AST) with the visited tableList and convert it back to SQL
https://taozhi8833998.github.io/node-sql-parser/
Apache License 2.0
783 stars 174 forks source link

have line/char available in AST? #1439

Open jlmgtech opened 1 year ago

jlmgtech commented 1 year ago

Not a bug, more of a feature. I wasn't sure where to ask. I'm writing an interpreter for SQL and I'd like to tell the user exactly where they made a semantic error. I was going to use sqlify() to render the branch of the tree the problem occurred on, but sqlify only accepts top-level ast nodes (for instance, I can't sqlify a column_ref). Is there something I can use to visually show the user where their error was made (perhaps line numbers somewhere or an offset, or maybe another sqlify function?).

Thank you.

aok-solutions commented 5 months ago

this already exists...when a parsing error is thrown, the error object contains it's exact location, e.g.:

{
  "message": "Expected \"!=\", \"#-\", \"#>\", \"#>>\", \"%\", \"&&\", \"'\", \"(\", \"*\", \"+\", \",\", \"-\", \"--\", \"->\", \"->>\", \".\", \"/\", \"/*\", \"//\", \"::\", \";\", \"<\", \"<=\", \"<>\", \"<@\", \"=\", \">\", \">=\", \"?\", \"?&\", \"?|\", \"@>\", \"AND\", \"AS\", \"BETWEEN\", \"FROM\", \"GROUP\", \"HAVING\", \"ILIKE\", \"IN\", \"INTO\", \"IS\", \"LIKE\", \"LIMIT\", \"NOT\", \"OFFSET\", \"OR\", \"ORDER\", \"REGEXP\", \"SIMILAR\", \"UNION\", \"WHERE\", \"WINDOW\", \"[\", \"\\\"\", \"`\", \"||\", [ \\t\\n\\r], [A-Za-z0-9_\\-$一-龥], [A-Za-z0-9_一-龥], [A-Za-z_一-龥], or end of input but \":\" found.",
  "found": ":",
  "location": {
    "start": {
      "offset": 10,
      "line": 1,
      "column": 11
    },
    "end": {
      "offset": 11,
      "line": 1,
      "column": 12
    }
  },
  "name": "SyntaxError",
  "isEvalError": true,
}
zwallacedev commented 4 months ago

To add on to @aok-solutions , you will need to implement a specific parameter in your options: includeLocations.

In the README.md, it specifies:

Get node location in the AST

const { Parser } = require('node-sql-parser');
const parser = new Parser();
const ast = parser.astify('SELECT * FROM t', { parseOptions: { includeLocations: true } });

console.log(ast);