node-sql-parser icon indicating copy to clipboard operation
node-sql-parser copied to clipboard

have line/char available in AST?

Open jlmgtech opened this issue 2 years ago • 2 comments

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.

jlmgtech avatar May 29 '23 15:05 jlmgtech

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,
}

aok-solutions avatar Apr 04 '24 19:04 aok-solutions

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);

zwallacedev avatar Apr 17 '24 15:04 zwallacedev