Sayonora
← Back to home — Oracle, SQL Server, and MySQL compatibility
built into Postgres itself — V$SESSION, DBMS_OUTPUT.PUT_LINE,
sys.objects, GROUP_CONCAT resolve natively, so migrated SQL that
touches a vendor catalog view or built-in package doesn't have to be rewritten before it
runs against Postgres. An Enterprise feature — see pricing
below.
Shim
Three plain Postgres extensions — pg_oracle, pg_mysql,
pg_sqlserver — not a forked Postgres binary, and not a wire-protocol
translator the way Warp itself is. Warp lets an
Oracle/MySQL/SQL Server client speak its native wire protocol to Postgres; this
layer lets Postgres itself resolve the catalog objects and built-in functions
that client's SQL actually references, once that traffic arrives. The two compose: Warp's
orawire/mywire/mssqlwire frontends set the session
GUC below automatically on connect, so a migrated application gets both — real wire
protocol AND real catalog compatibility — with zero client-side changes.
How it works#
One session GUC, db_emulation, accepts 'postgres' (the default —
no behavior change), 'oracle', 'mysql', or 'sqlserver'.
Setting it puts that vendor's schema(s) onto search_path, so unqualified
references the way real client code writes them resolve without a caller spelling out a
schema:
Oracle:
SET db_emulation = 'oracle';
SELECT * FROM v$session; -- oracle_catalog."v$session"
SELECT dbms_output.put_line('hi'); -- oracle_catalog.dbms_output.put_line
MySQL:
SET db_emulation = 'mysql';
SELECT last_insert_id(); -- mysql_catalog.last_insert_id
SHOW COLUMNS FROM orders; -- mysql_catalog.show_columns
SQL Server:
SET db_emulation = 'sqlserver';
SELECT OBJECT_ID('orders'); -- sys.object_id
SELECT SCOPE_IDENTITY(); -- sys.scope_identity
Plain psql against a Postgres instance with these extensions installed gets
identical behavior — no dependency on Warp at all. pg_mysql and
pg_sqlserver are pure SQL/plpgsql (no C of their own) and both require
pg_oracle, since db_emulation has to live in exactly one C
module and that module already ships the shared enum both extensions add a value to.
Oracle compatibility (pg_oracle)#
| Surface | What's real today |
|---|---|
| V$/GV$ views | V$VERSION, V$INSTANCE, V$DATABASE, V$PARAMETER, V$SESSION/GV$SESSION, V$SQL, V$SQL_PLAN, V$LOCK, V$TRANSACTION — thin views over pg_stat_activity/pg_locks/pg_settings/pg_stat_statements |
| DBA_*/USER_*/ALL_* views | DBA_TABLES, DBA_TAB_COLUMNS, DBA_INDEXES, DBA_OBJECTS, DBA_VIEWS, DBA_CONSTRAINTS, DBA_SEQUENCES, DBA_USERS, plus USER_*/ALL_* for the two most-queried tables |
| DBMS_OUTPUT | ENABLE/DISABLE/PUT_LINE/PUT/NEW_LINE/GET_LINE, faithful "silently dropped unless enabled" behavior |
| DBMS_RANDOM / DBMS_UTILITY / DBMS_ASSERT | VALUE/SEED/STRING; GET_TIME/DB_VERSION; the SQL-injection-defense helpers (SIMPLE_SQL_NAME, ENQUOTE_LITERAL, ...) real dynamic SQL calls |
| UTL_FILE | Real server-side file I/O — FOPEN/PUT_LINE/GET_LINE/FCLOSE — gated on Postgres's own pg_read_server_files/pg_write_server_files roles |
| DBMS_NETWORK_ACL_ADMIN + UTL_HTTP | Real ACL-gated outbound HTTP |
| DBMS_CRYPTO | Real hashing/HMAC/encryption, adapted over Postgres's own pgcrypto |
| DBMS_SCHEDULER | Real recurring jobs over pg_cron |
| DBMS_AQADM + DBMS_AQ | Real message queueing over SELECT ... FOR UPDATE SKIP LOCKED |
| DBMS_STATS | Real shim over ANALYZE/pg_class |
| SYS_CONTEXT + DBMS_SESSION | The VPD-enabling piece — session-context values a Postgres RLS policy can read |
| DBMS_SQL + DBMS_SYS_SQL | Dynamic SQL — OPEN_CURSOR/PARSE/BIND_VARIABLE/EXECUTE/FETCH_ROWS |
| NLS_*/TO_CHAR/TO_DATE, ALTER SESSION/SYSTEM | Format-string translation between Oracle and Postgres conventions |
| Schema-per-user | Real Oracle-native behavior — a user's own schema resolves the way Oracle's implicit CURRENT_SCHEMA does |
MySQL compatibility (pg_mysql)#
| Surface | What's real today |
|---|---|
| Session/ID functions | LAST_INSERT_ID, FIELD, FIND_IN_SET, IFNULL, RAND |
| Date/time | DATE_FORMAT, STR_TO_DATE, UNIX_TIMESTAMP, FROM_UNIXTIME |
| String | SUBSTRING_INDEX |
| Aggregation | GROUP_CONCAT — a real Postgres aggregate (state/final functions), not a string hack |
| Introspection | SHOW COLUMNS/DESCRIBE, SHOW INDEX, SHOW VARIABLES, SHOW CREATE TABLE |
SQL Server compatibility (pg_sqlserver)#
| Surface | What's real today |
|---|---|
sys.* catalog views | sys.tables, sys.columns, sys.views, sys.objects, sys.schemas, sys.databases, sys.types, sys.indexes, sys.foreign_keys |
| T-SQL system functions | OBJECT_ID, OBJECT_NAME, COL_NAME, SCHEMA_NAME, DB_NAME, SCOPE_IDENTITY |
| String functions | CHARINDEX, PATINDEX, STUFF, REPLICATE, LEN |
| Conditional | IIF |
MongoDB compatibility is out of scope for this layer (a document store, not a
catalog/function-surface problem the way the three SQL engines above are) — see
Warp's mongowire frontend for document workloads instead.
The tables above are what's real today, not the ceiling — more catalog views, packages,
and built-in functions get added to pg_oracle/pg_mysql/
pg_sqlserver as real migrations surface a gap, the same demand-driven way
Ferry's own connector list grew. If a specific V$ view, DBMS_*
package, or vendor function your application actually calls isn't listed above, that's
the kind of gap worth raising — see Contact.
Pricing#
The Shim is an Enterprise feature, starting at $5,000/year per
production deployment. A valid WARP_LICENSE_KEY — the same key that
unlocks Warp's own Enterprise tier and Ferry's parallel migration — is what
makes orawire/
mywire/mssqlwire issue SET db_emulation = '...' on
connect. On the free/Developer tier, a session still connects and runs ordinary SQL
normally; it just runs against plain, unmodified Postgres semantics, exactly as it would
if these extensions weren't installed at all — the unqualified V$SESSION/
DBMS_OUTPUT.PUT_LINE/sys.objects/MySQL-function-name resolution
above is what's gated, not the connection itself.
Free / Basic
$0
A session still connects and runs ordinary SQL normally.
- No unqualified
V$/DBA_*/DBMS_*resolution - No unqualified
sys.*/T-SQL function resolution - No unqualified MySQL built-in function resolution
Enterprise
$5,000 / year, starting
Per production deployment. For a migrated application that still calls vendor catalog objects or built-ins.
- Oracle: V$/GV$ views, DBA_*/USER_*/ALL_* views, 13 DBMS_*/UTL_* packages
- MySQL: GROUP_CONCAT, DATE_FORMAT, SHOW COLUMNS/INDEX/VARIABLES, and more
- SQL Server: sys.* catalog views, OBJECT_ID, SCOPE_IDENTITY, and more T-SQL functions
- Enterprise support
Full comparison across Warp, Ferry, and Shim: Pricing overview →