Skip to content

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

@benjie

Description

@benjie

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions