SQLParity

Prove every row made it across.

Compare two copies of a table, convert queries and run them on real engines, and hand your reviewer a signed-off report. All inside your browser tab — your data is never uploaded.

  • No account, no upload
  • CSV, Parquet and JSON
  • Free for commercial use
Parity Run

CSVcustomers.csv

Rows12,480Columns6

PQcustomers_v2.parquet

Rows12,479Columns7

Differences found

  • 1 key in the source is missing from the target
  • country: 38 matched rows hold a different value
Keys matched
12,478
Only in source
1
Only in target
0
Columns differ
1
namematch
emailmatch
country38 rows
lifetime_valuematch
SQLParitySign-off report

Customers — nightly sync check

Differences found

source 4738cfd4c0eb69fd…
target d1cef7985d2510c8…

Reviewed byApproved by
  • Real SQL engines in the tab
  • Sixteen SQL dialects
  • Enforced by the browser
  • Free, no sign-up

One workflow, from schema to sign-off

Each tool does one job on its own. Used together, they take you from "what changed?" to evidence your reviewer can sign.

  1. 1

    See what changed

    Schema Diff

    Paste the old and new CREATE TABLE. Get every added, dropped and retyped column.

    + signup_channel varchar
    ~ total_spend int → bigint
    − legacy_ref varchar
    = customer_id varchar
  2. 2

    Generate the checks

    Bulk Query Generator

    One validation query per changed column, with the right NULL placeholder for each type.

    -- 1 of 3 SELECT 'total_spend', count(*) FROM input_db a JOIN output_db b ON …
  3. 3

    Convert and run them

    SQL Converter

    Move the checks to the target engine, then run them on real PostgreSQL or SQLite in the tab.

    SQL Server → PostgreSQL
    ✓ Runs on PostgreSQL 18
    ✓ Same answer as the original
    3 rows · 21 ms
  4. Prove the data

    Parity Run

    Drop both exports. Every row matched on its key, every difference counted, the report downloaded.

    = Match
    12,480 rows against 12,480
    7 columns, 0 differences
    report.html ready to sign

Every tool, grouped by the job

The same three groups as the Tools menu, so the page and the navigation teach one map of the product.

Built for data that is not allowed to leave the building

Your infosec team does not have to take our word for it. Every guarantee below is a mechanism they can check in two minutes with the browser's developer tools.

  • The browser enforces itA Content Security Policy forbids the page from contacting any other origin.
  • Engines and fonts are served from this siteThe SQL engines load from the same origin, and only when a tool needs them.
  • No account, no cookiesVisits are counted without cookies. What you paste is never part of it.
  • Check it yourselfOpen the network tab while you work: nothing you paste or drop is ever sent.
Content-Security-Policy
default-src     'self';font-src        'self';connect-src     'self';   -- no request to any other serverworker-src      'self' blob:;form-action     'none';frame-ancestors 'none';
Network — this sessionorigin
/engines/pglite/pglite.wasmthis site
/engines/sqlite/sqlite3.wasmthis site
/_vercel/insights/viewthis site
Requests to other servers0
SQLParityParity sign-off report

Customers — nightly sync check

Generated 2026-10-07 09:05 UTC · Prepared by Data platform team

Differences found

  • 1 key in the source is missing from the target.
  • country: 38 matched rows hold a different value.
SideFileRows
Sourcecustomers.csv12,480
Targetcustomers_v2.parquet12,479
Reviewed by, and dateApproved by, and date

Hand your reviewer evidence, not a screenshot

Every Parity Run ends in a report someone can sign: one HTML file that prints cleanly to PDF and needs nothing to open.

  • Reproducible. Both files are identified by their SHA-256 fingerprint, with every setting and SQL statement printed.
  • Honest. A match on some columns is never called a match, and every relaxed comparison is listed.
  • Private by default. Example values are real data, so they stay out unless you include them.
See a report from example data

Sixteen dialects that disagree about quoting

A wrong escape does not throw — it runs, and returns the wrong rows. So every dialect carries its own rules, and every rule is tested.

"id"
How a name is quoted
''
How an apostrophe is escaped
\\
Backslashes must be doubled

PostgreSQL

"name"''

MySQL

`name`''\\

SQLite

"name"''

SQL Server (T-SQL)

[name]''

Oracle

"name"''

MariaDB

`name`''\\

Snowflake

"name"''\\

Google BigQuery

`name`\'\\

Amazon Redshift

"name"''\\

Amazon Athena / Trino

"name"''

Apache Spark SQL

`name`\'\\

Apache Hive

`name`\'\\

ClickHouse

`name`''\\

DuckDB

"name"''

IBM Db2

"name"''

Standard SQL

"name"''

Start with your own two files

Nothing to install, nothing to sign up for. Close the tab and it is gone.