JarvisX
Proof, not promises · credential-free · pre-cutover

23 conversions that passed review — and silently returned the wrong data

Every conversion below parses, runs, and looks correct — yet returns different result rows than the source query. Each was proven wrong by JarvisX’s credential-free execution oracle (the engine behind /prove) on a synthetic sample fixture. A syntax or compile check passes all of them. These are the defect classes real migrations ship — from hand-written SQL, a transpiler, or a raw LLM.

23
machine-proven silently wrong
19
return the SAME row count — slip past a rowcount check
4
change the row count outright
01Aggregate inflation· teradatabigquerysame rows · wrong values

COUNT(DISTINCT) silently became COUNT() — a de-dup requirement was lost, inflating a reported total.

Source · teradata
SELECT COUNT(DISTINCT cust_id) AS active_customers FROM orders
Converted (silently wrong) · bigquery
SELECT COUNT(cust_id) AS active_customers FROM orders
source returned 1 rows · conversion returned 1 — same count, different values
02Duplicate rows· oraclesnowflakerow count changes

SELECT DISTINCT lost its DISTINCT — a dimension list now emits duplicates.

Source · oracle
SELECT DISTINCT status FROM orders
Converted (silently wrong) · snowflake
SELECT status FROM orders
source returned 3 rows · conversion returned 8
03Filter silently removed· teradatasnowflakerow count changes

The HAVING clause was dropped in conversion — groups that should have been filtered now appear.

Source · teradata
SELECT cust_id, COUNT(*) AS n FROM orders GROUP BY cust_id HAVING COUNT(*) > 1
Converted (silently wrong) · snowflake
SELECT cust_id, COUNT(*) AS n FROM orders GROUP BY cust_id
source returned 3 rows · conversion returned 5
04Rows silently dropped· sqlserverdatabricksrow count changes

A LEFT JOIN became an INNER JOIN — unmatched driving-table rows silently disappear.

Source · sqlserver
SELECT o.cust_id, o.amount FROM orders o LEFT JOIN refunds r ON o.cust_id = r.cust_id
Converted (silently wrong) · databricks
SELECT o.cust_id, o.amount FROM orders o INNER JOIN refunds r ON o.cust_id = r.cust_id
source returned 12 rows · conversion returned 8
05Sign flip on date math· oraclesnowflakesame rows · wrong values

Date-difference arguments were reversed in conversion — every duration comes out negated.

Source · oracle
SELECT (ship_date - order_date) AS lead_days FROM orders
Converted (silently wrong) · snowflake
SELECT DATEDIFF('day', ship_date, order_date) AS lead_days FROM orders
source returned 8 rows · conversion returned 8 — same count, different values
06Wrong record returned· teradatabigquerysame rows · wrong values

ORDER BY direction flipped on a top-1 query — it returns the smallest where the source returned the largest.

Source · teradata
SELECT cust_id FROM orders ORDER BY amount DESC LIMIT 1
Converted (silently wrong) · bigquery
SELECT cust_id FROM orders ORDER BY amount ASC LIMIT 1
source returned 1 rows · conversion returned 1 — same count, different values
07Filter set shrunk· sqlserversnowflakesame rows · wrong values

An IN-list lost members during conversion — rows that should qualify are excluded.

Source · sqlserver
SELECT COUNT(*) AS n FROM orders WHERE cust_id IN (1, 2, 3, 4, 5)
Converted (silently wrong) · snowflake
SELECT COUNT(*) AS n FROM orders WHERE cust_id IN (1, 2, 3)
source returned 1 rows · conversion returned 1 — same count, different values
08Off-by-one on threshold· teradatabigquerysame rows · wrong values

>= became > — records exactly on the threshold are silently excluded.

Source · teradata
SELECT COUNT(*) AS n FROM orders WHERE cust_id >= 3
Converted (silently wrong) · bigquery
SELECT COUNT(*) AS n FROM orders WHERE cust_id > 3
source returned 1 rows · conversion returned 1 — same count, different values
09Wrong measure summed· oracledatabrickssame rows · wrong values

SUM was pointed at the wrong column in conversion — the total is of price, not amount.

Source · oracle
SELECT SUM(amount) AS revenue FROM orders
Converted (silently wrong) · databricks
SELECT SUM(price) AS revenue FROM orders
source returned 1 rows · conversion returned 1 — same count, different values
10Inclusive range made exclusive· sqlserversnowflakesame rows · wrong values

BETWEEN (inclusive) became strict < / > — the endpoints are silently dropped.

Source · sqlserver
SELECT COUNT(*) AS n FROM orders WHERE cust_id BETWEEN 2 AND 4
Converted (silently wrong) · snowflake
SELECT COUNT(*) AS n FROM orders WHERE cust_id > 2 AND cust_id < 4
source returned 1 rows · conversion returned 1 — same count, different values
11Result silently truncated· teradatabigqueryrow count changes

A LIMIT (likely a leftover sampling clause) was introduced — the result set is cut short.

Source · teradata
SELECT cust_id, amount FROM orders
Converted (silently wrong) · bigquery
SELECT cust_id, amount FROM orders LIMIT 5
source returned 8 rows · conversion returned 5
12Row fan-out· oraclepostgresqlsame rows · wrong values

An extra self-join inflates the row count through fan-out on a non-unique key.

Source · oracle
SELECT COUNT(*) AS n FROM orders
Converted (silently wrong) · postgresql
SELECT COUNT(*) AS n FROM orders o1 JOIN orders o2 ON o1.cust_id = o2.cust_id
source returned 1 rows · conversion returned 1 — same count, different values
13Extremum swapped· sqlserverdatabrickssame rows · wrong values

MAX was converted to MIN — the query now reports the opposite extreme.

Source · sqlserver
SELECT MAX(amount) AS peak FROM orders
Converted (silently wrong) · databricks
SELECT MIN(amount) AS peak FROM orders
source returned 1 rows · conversion returned 1 — same count, different values
14Bucket boundary shifted· teradatasnowflakesame rows · wrong values

A CASE threshold moved from >= to > — a whole boundary bucket is misclassified.

Source · teradata
SELECT SUM(CASE WHEN cust_id >= 3 THEN 1 ELSE 0 END) AS flagged FROM orders
Converted (silently wrong) · snowflake
SELECT SUM(CASE WHEN cust_id > 3 THEN 1 ELSE 0 END) AS flagged FROM orders
source returned 1 rows · conversion returned 1 — same count, different values
15Boolean precedence changed· oraclebigquerysame rows · wrong values

Missing parentheses changed AND/OR precedence — the predicate now matches a different set.

Source · oracle
SELECT COUNT(*) AS n FROM orders WHERE (cust_id = 1 OR cust_id = 2) AND amount > 0
Converted (silently wrong) · bigquery
SELECT COUNT(*) AS n FROM orders WHERE cust_id = 1 OR cust_id = 2 AND amount > 0
source returned 1 rows · conversion returned 1 — same count, different values
16Exclusion inverted scope· sqlserversnowflakesame rows · wrong values

A <> filter was converted to = — the query returns the complement of what was intended.

Source · sqlserver
SELECT COUNT(*) AS n FROM orders WHERE cust_id <> 3
Converted (silently wrong) · snowflake
SELECT COUNT(*) AS n FROM orders WHERE cust_id = 3
source returned 1 rows · conversion returned 1 — same count, different values
17Distinct-count dropped (region)· teradatadatabrickssame rows · wrong values

COUNT(DISTINCT region_id) lost DISTINCT — a cardinality metric is overstated.

Source · teradata
SELECT COUNT(DISTINCT region_id) AS regions FROM orders
Converted (silently wrong) · databricks
SELECT COUNT(region_id) AS regions FROM orders
source returned 1 rows · conversion returned 1 — same count, different values
18Threshold widened· sqlserverbigquerysame rows · wrong values

> became >= — records on the boundary are now wrongly included.

Source · sqlserver
SELECT COUNT(*) AS n FROM orders WHERE cust_id > 3
Converted (silently wrong) · bigquery
SELECT COUNT(*) AS n FROM orders WHERE cust_id >= 3
source returned 1 rows · conversion returned 1 — same count, different values
19Count-for-sum· teradatapostgresqlsame rows · wrong values

SUM(amount) was converted to COUNT(*) — a monetary total became a row count.

Source · teradata
SELECT SUM(amount) AS total FROM orders
Converted (silently wrong) · postgresql
SELECT COUNT(*) AS total FROM orders
source returned 1 rows · conversion returned 1 — same count, different values
20Comparison direction flipped· sqlserverdatabrickssame rows · wrong values

A < filter was converted to > — the query returns the opposite tail of the distribution.

Source · sqlserver
SELECT COUNT(*) AS n FROM orders WHERE cust_id < 3
Converted (silently wrong) · databricks
SELECT COUNT(*) AS n FROM orders WHERE cust_id > 3
source returned 1 rows · conversion returned 1 — same count, different values
21Aggregation level changed· teradatabigquerysame rows · wrong values

A GROUP BY dimension was dropped — rows collapse to a coarser grain than intended.

Source · teradata
SELECT region, status, COUNT(*) AS n FROM orders GROUP BY region, status
Converted (silently wrong) · bigquery
SELECT region, COUNT(*) AS n FROM orders GROUP BY region
source returned 3 rows · conversion returned 3 — same count, different values
22Composite distinct dropped· teradatadatabrickssame rows · wrong values

COUNT(DISTINCT concat) collapsed to COUNT — a composite-cardinality metric is inflated.

Source · teradata
SELECT COUNT(DISTINCT region_id) AS n FROM refunds
Converted (silently wrong) · databricks
SELECT COUNT(region_id) AS n FROM refunds
source returned 1 rows · conversion returned 1 — same count, different values
23Rows silently added· oraclesnowflakesame rows · wrong values

An INNER JOIN became a LEFT JOIN — unmatched rows with NULLs are silently introduced.

Source · oracle
SELECT COUNT(*) AS n FROM refunds r INNER JOIN orders o ON r.cust_id = o.cust_id
Converted (silently wrong) · snowflake
SELECT COUNT(*) AS n FROM refunds r LEFT JOIN orders o ON r.cust_id = o.cust_id
source returned 1 rows · conversion returned 1 — same count, different values

Prove your own — free

Paste a source query and its conversion from any tool. JarvisX independently proves whether they return the same rows — no signup, no production access, nothing leaves your boundary.

Prove a conversion — free →

Reproducible: this corpus is generated by an open harness (benchmark/gtm_silent_bugs.py) that runs each conversion through the same execution oracle and keeps only the ones it can prove wrong on the fixture.