Sayonora

Sayonora

← Back to homeOracle, SQL Server, and MySQL compatibility built into Postgres itselfV$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.

01 Part of Warp

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)

SurfaceWhat's real today
V$/GV$ viewsV$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_* viewsDBA_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_OUTPUTENABLE/DISABLE/PUT_LINE/PUT/NEW_LINE/GET_LINE, faithful "silently dropped unless enabled" behavior
DBMS_RANDOM / DBMS_UTILITY / DBMS_ASSERTVALUE/SEED/STRING; GET_TIME/DB_VERSION; the SQL-injection-defense helpers (SIMPLE_SQL_NAME, ENQUOTE_LITERAL, ...) real dynamic SQL calls
UTL_FILEReal 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_HTTPReal ACL-gated outbound HTTP
DBMS_CRYPTOReal hashing/HMAC/encryption, adapted over Postgres's own pgcrypto
DBMS_SCHEDULERReal recurring jobs over pg_cron
DBMS_AQADM + DBMS_AQReal message queueing over SELECT ... FOR UPDATE SKIP LOCKED
DBMS_STATSReal shim over ANALYZE/pg_class
SYS_CONTEXT + DBMS_SESSIONThe VPD-enabling piece — session-context values a Postgres RLS policy can read
DBMS_SQL + DBMS_SYS_SQLDynamic SQL — OPEN_CURSOR/PARSE/BIND_VARIABLE/EXECUTE/FETCH_ROWS
NLS_*/TO_CHAR/TO_DATE, ALTER SESSION/SYSTEMFormat-string translation between Oracle and Postgres conventions
Schema-per-userReal Oracle-native behavior — a user's own schema resolves the way Oracle's implicit CURRENT_SCHEMA does

MySQL compatibility (pg_mysql)

SurfaceWhat's real today
Session/ID functionsLAST_INSERT_ID, FIELD, FIND_IN_SET, IFNULL, RAND
Date/timeDATE_FORMAT, STR_TO_DATE, UNIX_TIMESTAMP, FROM_UNIXTIME
StringSUBSTRING_INDEX
AggregationGROUP_CONCAT — a real Postgres aggregate (state/final functions), not a string hack
IntrospectionSHOW COLUMNS/DESCRIBE, SHOW INDEX, SHOW VARIABLES, SHOW CREATE TABLE

SQL Server compatibility (pg_sqlserver)

SurfaceWhat's real today
sys.* catalog viewssys.tables, sys.columns, sys.views, sys.objects, sys.schemas, sys.databases, sys.types, sys.indexes, sys.foreign_keys
T-SQL system functionsOBJECT_ID, OBJECT_NAME, COL_NAME, SCHEMA_NAME, DB_NAME, SCOPE_IDENTITY
String functionsCHARINDEX, PATINDEX, STUFF, REPLICATE, LEN
ConditionalIIF

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

Schedule a Warp Architecture Review →

Full comparison across Warp, Ferry, and Shim: Pricing overview →