1
|
#!/bin/bash -e
|
2
|
# Translates a MySQL DB export to PostgreSQL
|
3
|
# The export must be created with:
|
4
|
# `--compatible=postgresql --add-locks=false --set-charset`
|
5
|
# Usage: self {input...|<input} >translated
|
6
|
|
7
|
. "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"/../lib/sh/util.sh
|
8
|
|
9
|
sed \
|
10
|
-e 's/`/"/g' \
|
11
|
-e 's/ UNIQUE KEY ("[^"]*")/ \/*CONSTRAINT \1 *\/UNIQUE/g' \
|
12
|
-e 's/ UNIQUE KEY/ UNIQUE/g' \
|
13
|
-e 's/^ ((CONSTRAINT "[^"]*" )?((FULLTEXT|FOREIGN) )?KEY .*[^,])(,?)$/ \/*\1*\/CHECK (true)\5/' \
|
14
|
-e "s/\/\*.* (SET NAMES )([0-9A-Za-z_]+) \*\/;/\1'\2';/" \
|
15
|
-e 's/ (CHARACTER SET|COLLATE) [0-9A-Za-z_]+//g' \
|
16
|
-e "s/ COMMENT '.*'//g
|
17
|
# COMMENTs never span multiple lines because newlines are encoded as \n" \
|
18
|
${sql_ascii:+-e 's/ varbinary/ text/g' }\
|
19
|
-e 's/ (binary|blob|varbinary)/ bytea/g' \
|
20
|
-e 's/ (tinytext|mediumtext|longtext)/ text/g' \
|
21
|
-e 's/ (int|mediumint|smallint|tinyint)([ (])/ integer\2/g' \
|
22
|
-e 's/ double/ double precision/g' \
|
23
|
-e 's/ (integer|bigint|bytea|double precision|float|text)(\([^)]*\))?( unsigned)?/ \1/g' \
|
24
|
-e 's/ (char)\(0\)/ \1/g' \
|
25
|
-e 's! (date|datetime|time|timestamp)! text/*\1*/!g' \
|
26
|
-e 's/ ("[^"]*") enum(\([^()]*\))/ \1 text CHECK (\1 in \2)/g' \
|
27
|
-e "s/ set\('([^()]*)'\)/ \1/g" \
|
28
|
"$@"\
|
29
|
|"$top_dir/my2pg.data"
|