Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

When pg-minify fails, it's hard to locate the issue #93

Open
benjie opened this issue Sep 22, 2020 · 2 comments
Open

When pg-minify fails, it's hard to locate the issue #93

benjie opened this issue Sep 22, 2020 · 2 comments

Comments

@benjie
Copy link
Member

benjie commented Sep 22, 2020

Summary

When pg-minify fails, Graphile Migrate outputs pg-minify's error, but doesn't relate it to the file that actually caused the problem. This is particularly problematic if you have a large (e.g. initial) migration and you're using the current/ folder - you don't know which file the error occurred in.

Steps to reproduce

current/12000-insert_iso3166_countries.sql:

COPY countries (name, alpha_2, code) FROM stdin DELIMITER '|';
Kyrgyzstan|KG|417
Lao People's Democratic Republic|LA|418
Latvia|LV|428
\.

Expected results

Error on line 3 of 12000-insert_iso3166_countries.sql (we don't support COPY syntax).

Actual results

🛑 Error occurred whilst processing migration
    SQLParsingError: Error parsing SQL at {line:24153,col:11}: Unclosed text block.

Additional context

graphile-migrate 1.0.1; linux; current/ folder.

Possible Solution

The following mod to dist/commands/watch.js gives more information:

                let currentBodyMinified;
                try {
                  currentBodyMinified = pgMinify(currentBodyFromDryRun);
                } catch (e) {
                  const matches = e.message.match(/Error parsing SQL at \{line:(\d+),col:(\d+)\}/);
                  if (matches) {
                    const [_, ln, col] = matches;
                    const lines = currentBodyFromDryRun.split("\n");
                    const leadingLines = lines.slice(0, +ln);
                    const lastSplit = [...leadingLines].reverse().find(l => l.match(/^--! split/));
                    let filename = null;
                    let offset = 0;
                    if (lastSplit) {
                      filename = lastSplit.split(':')[1].trim();
                      const index = leadingLines.indexOf(lastSplit);
                      offset = index + 1;
                    }

                    const previousLine = lines[+ln - 2];
                    const line = lines[+ln - 1];
                    const nextLine = lines[+ln];
                    const details = filename ? `current/${filename} line ${+ln - offset}-ish` : `current.sql line ${ln}-ish`
                    console.error(`Error happened around here ${details}:`);
                    console.error();
                    console.error(previousLine || "");
                    console.error(line || "");
                    console.error("-".repeat(+col - 1) + "^");
                    console.error(nextLine || "");
                  }
                  throw e;
                }

produces:

Error happened around here current/12000-insert_iso3166_countries.sql line 3-ish:

Kyrgyzstan|KG|417
Lao People's Democratic Republic|LA|418
----------^
Latvia|LV|428

🛑 Error occurred whilst processing migration
    SQLParsingError: Error parsing SQL at {line:24153,col:11}: Unclosed text block.

@vitaly-t
Copy link
Contributor

vitaly-t commented May 31, 2024

When pg-minify fails, it throws an extended error object of type SQLParsingError:

https://github.com/vitaly-t/pg-minify/blob/0ad663d4e66ad1d325a658be61eccf80eb5df91c/typescript/pg-minify.d.ts#L24

which contains code and position, so there is no need parsing the error text.

@benjie
Copy link
Member Author

benjie commented Jun 4, 2024

Thanks @vitaly-t; that knowledge will make addressing this much easier! ❤️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants