$ echo 'select first 1 hello from world' | sqlport
SELECT hello FROM world LIMIT 1;
$ sqlport -h
usage: sqlport [-h] [--outfile OUTFILE | --outdir OUTDIR | --replace]
[--file-list [FILE]] [--quiet] [--verbose] [--debug]
[--parse-tree] [--lex] [--informix]
[INFILE [INFILE ...]]
Ports SQL code to another dialect.
positional arguments:
INFILE
optional arguments:
-h, --help show this help message and exit
--outfile OUTFILE, -o OUTFILE
output file path pattern with place holders: "#" =
input file path; "%" = input file path with last file
extension removed; "%%" = input file path with last
two file extensions removed; ...
--outdir OUTDIR, -d OUTDIR
output base directory
--replace, -r replace input file
--file-list [FILE], -f [FILE]
read file list from file or stdin
--quiet, -q do not output anything
--verbose, -v verbose output
--debug, -D debugging output
--parse-tree, -T show parse tree
--lex, -L show lexer output
--informix, -i generate informix SQL
| Informix | Postgres |
|---|---|
lvarchar |
varchar |
varchar(x,y) |
varchar(x) |
byte |
bytea |
interval (1) year to month |
interval |
| Informix | Postgres |
|---|---|
current |
current_timestamp |
today |
current_date |
"some text" |
'some text' |
| Informix | Postgres |
|---|---|
SELECT FIRST 1 ... |
SELECT ... LIMIT 1 |
SELECT UNIQUE ... |
SELECT DISTINCT ... |
SELECT ... INTO TEMP x |
CREATE TEMP TABLE x AS SELECT ... |
SELECT x, y, z FROM TABLE(some_function(a, b)) AS t (x, y, z) |
SELECT x, y, z FROM some_function(a, b) AS t (x, y, z) |
nvl(x, y) |
coalesce(x, y) |
ALTER TABLE ADD CONSTRAINT PRIMARY KEY ... |
ALTER TABLE ADD PRIMARY KEY ... |
UPDATE STATISTICS [FOR table_name] |
ANALYZE [table_name] |
| Informix | Postgres |
|---|---|
CREATE PROCEDURE |
CREATE FUNCTION |
DROP PROCEDURE |
DROP FUNCTION |
RETURNING |
RETURNS |
| no return value | RETURNS void |
DEFINE x integer |
x integer in DECLARE block |
DEFINE x, y integer |
converted to individual declarations |
LET x = y |
x := y |
IF ... ELIF ... END IF |
IF ... ELSIF ... END IF |
WHILE x=y ... END WHILE |
WHILE x=y LOOP ... END LOOP |
EXIT WHILE, EXIT FOR, ... |
EXIT |
RAISE EXCEPTION -746, 0, "some text" |
RAISE EXCEPTION "Error: %", 'some text' |
semicolon optional after END IF, END FOR, ... |
semicolon always required |
EXECUTE PROCEDURE name(x,y), CALL name(x, y) |
SELECT name(x, y), PERFORM name(x, y) |
- Informix:
MERGE INTO x USING y ON y.y1 = x.x1 WHEN MATCHED THEN UPDATE SET x.x2 = y.y2 WHEN NOT MATCHED THEN INSERT (x1, x2) VALUES (y1, y2) - Postgres:
INSERT INTO x (x1, x2) SELECT y1, y2 FROM y ON CONFLICT (x1) DO UPDATE SET x1 = y1, x2 = y2 MERGEwithout WHEN NOT MATCHES THEN INSERT is translated into UPDATE FROM syntax.
- Informix:
all,end,default, ... - Postgres: not allowed
- append underscore, e.g.
all_,end_,default_, ...
- Postgres: contraint name must differ from table name
- Prefix constraint name, e.g. with
pk_
- Informix:
SYSTEM "sleep 10" - Postgres:
PERFORM system('sleep 10') - The
systemfunction has to be defined separately
- Informix:
ALTER TABLE x ADD a int BEFORE c - Postgres:
BEFOREis not supported BEFORE cis dropped
- Informix:
FOREACH SELECT a, b INTO x, y FROM ... ... END FOREACH - Postgres:
FOR record IN SELECT a AS x, b AS y FROM ... LOOP ... X := record x; y := record y; ... END LOOP; - Using the record type directly could be cleaner.
- Informix:
SELECT ... FROM a, OUTER(b) - Postgres: not supported
- Supports limited translation to ANSI JOINs for simple cases.
- Informix:
ON EXCEPTION IN (-206, -958) ... END EXCEPTION - Postgres:
BEGIN ... EXCEPTION WHEN undefined_table OR duplicate_table THEN ... END - Only a few error codes are mapped
- WITH RESUME is not supported
- ON EXCEPTION without error code is not supported
- Informix:
decimal(20) - If you omit the scale in Informix it is not fixed.
- If you omit the scale in Postgres it defaults to zero.
- Currently these cases are translated to
DECIMAL(30,10).
- Informix:
MATCHES "*[a-z]?" - Postgres:
SIMILAR TO "%[a-z]_" - This is converted for literal string patterns, but not if the pattern is a variable.
- Informix:
text[2,4] - Postgres:
substring(text from 2 for 3) - This is automatically converted. However this does not work if the slice is on the left side of a
letstatement (variable assignment).
| Informix | Postgres |
|---|---|
multiset(integer) |
|
SET LOCK MODE |
|
DEFINE GLOBAL |
|
database[@server]:name |
|
sys* tables |
|
LET x, y = y, x |
|
GRANT, REVOKE |
|
| multiple return values | use record type or OUT paramters |
| named return parameters |
If something is not automatically translated a NOT_SUPPORTED message is included in the output.