dburl.c sample output
[sql:][scheme[<+>dsn]]://[[user[:[password]]@][host][:port][/[database][/[[table[/[column[,column...]*]]]|sql]]]
^(?#
Optional prefix 'sql:'
)(?:sql:)?(?#
Scheme: mysql|pgsql
)([-.a-z0-9]*)(?:[+]([-.a-z0-9]*))?(?#
Required: URL identifier
)://(?#
User name + password
)(?:(?#
Username
)([-a-z0-9_]+)(?#
Password
)(?::([^@]*))?@)?(?#
Hostname
)((?#
localhost | example
)(?:[a-z0-9]+(?:-+[-a-z0-9]+)*)|(?#
Domain name with dot: example.com
)(?:(?:[a-z0-9]+(?:-+[a-z0-9]+)*\.)?(?:[a-z0-9]+(?:-+[a-z0-9]+)*\.)+(?:[a-z]{2,7})\.?)|(?#
IPv4 number
)(?:(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[0-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[0-9][0-9]|[0-9]))?(?#
Port number: 3306|5432
)(?::(\d{1,5}))?(?#
DB, table, SQL
)(?:/(?:(?#
Database: joe|mydb, default $USER
)(?:([_a-z0-9]+)?(?:/(?:(?#
Table: mytable
)(?:([_a-z0-9]+)(?#
Columns: id, name
)(?:/((?:[_a-z0-9]+)(?:,[_a-z0-9]+)*)?)?)|((?#
SQL: SELECT id, name FROM mytable
)[^\h]+\h.+)?)?)?)?)?)?$
Input: 'pgsqls://example/'
111111___5555555
# 0 [ 0 17]: pgsqls://example/
# 1 [ 0 6]: pgsqls
# 2 [-1 -1]:
# 3 [-1 -1]:
# 4 [-1 -1]:
# 5 [ 9 16]: example
1. scheme : pgsqls
2. dsn : (null)
3. user : <user-name>
4. password : <none>
5. host : example
6. port : <scheme-default>
7. database : <user-name>
8. table : (null)
9. coloumn : (null)
10. sql : (null)
Input: 'scheme+dsn://user:password@host:12345/database/SELECT * FROM mytable'
111111_222___3333_44444444_5555_66666_77777777_000000000000000000000
# 0 [ 0 68]: scheme+dsn://user:password@host:12345/database/SELECT * FROM mytable
# 1 [ 0 6]: scheme
# 2 [ 7 10]: dsn
# 3 [13 17]: user
# 4 [18 26]: password
# 5 [27 31]: host
# 6 [32 37]: 12345
# 7 [38 46]: database
# 8 [-1 -1]:
# 9 [-1 -1]:
# 10 [47 68]: SELECT * FROM mytable
1. scheme : scheme
2. dsn : dsn
3. user : user
4. password : password
5. host : host
6. port : 12345
7. database : database
8. table : (null)
9. coloumn : (null)
10. sql : SELECT * FROM mytable
Input: 'scheme+dsn://user:password@host:5432/database/foobar'
111111_222___3333_44444444_5555_6666_77777777_888888
# 0 [ 0 52]: scheme+dsn://user:password@host:5432/database/foobar
# 1 [ 0 6]: scheme
# 2 [ 7 10]: dsn
# 3 [13 17]: user
# 4 [18 26]: password
# 5 [27 31]: host
# 6 [32 36]: 5432
# 7 [37 45]: database
# 8 [46 52]: foobar
1. scheme : scheme
2. dsn : dsn
3. user : user
4. password : password
5. host : host
6. port : 5432
7. database : database
8. table : foobar
9. coloumn : (null)
10. sql : (null)
Input: 'scheme+dsn://user:password@1.2.3.4:5432/database/foo/barbar,quux'
111111_222___3333_44444444_5555555_6666_77777777_888_99999999999
# 0 [ 0 64]: scheme+dsn://user:password@1.2.3.4:5432/database/foo/barbar,quux
# 1 [ 0 6]: scheme
# 2 [ 7 10]: dsn
# 3 [13 17]: user
# 4 [18 26]: password
# 5 [27 34]: 1.2.3.4
# 6 [35 39]: 5432
# 7 [40 48]: database
# 8 [49 52]: foo
# 9 [53 64]: barbar,quux
1. scheme : scheme
2. dsn : dsn
3. user : user
4. password : password
5. host : 1.2.3.4
6. port : 5432
7. database : database
8. table : foo
9. coloumn : barbar,quux
10. sql : (null)
Input: 'mysql:///db_name/SELECT * FROM foo;'
11111____7777777_000000000000000000
# 0 [ 0 35]: mysql:///db_name/SELECT * FROM foo;
# 1 [ 0 5]: mysql
# 2 [-1 -1]:
# 3 [-1 -1]:
# 4 [-1 -1]:
# 5 [-1 -1]:
# 6 [-1 -1]:
# 7 [ 9 16]: db_name
# 8 [-1 -1]:
# 9 [-1 -1]:
# 10 [17 35]: SELECT * FROM foo;
1. scheme : mysql
2. dsn : (null)
3. user : <user-name>
4. password : <none>
5. host : localhost
6. port : <scheme-default>
7. database : db_name
8. table : (null)
9. coloumn : (null)
10. sql : SELECT * FROM foo;
Input: 'mysql:////SELECT * FROM foo;'
11111_____000000000000000000
# 0 [ 0 28]: mysql:////SELECT * FROM foo;
# 1 [ 0 5]: mysql
# 2 [-1 -1]:
# 3 [-1 -1]:
# 4 [-1 -1]:
# 5 [-1 -1]:
# 6 [-1 -1]:
# 7 [-1 -1]:
# 8 [-1 -1]:
# 9 [-1 -1]:
# 10 [10 28]: SELECT * FROM foo;
1. scheme : mysql
2. dsn : (null)
3. user : <user-name>
4. password : <none>
5. host : localhost
6. port : <scheme-default>
7. database : <user-name>
8. table : (null)
9. coloumn : (null)
10. sql : SELECT * FROM foo;
Input: ':////SELECT * FROM foo;'
_____000000000000000000
# 0 [ 0 23]: :////SELECT * FROM foo;
# 1 [ 0 0]:
# 2 [-1 -1]:
# 3 [-1 -1]:
# 4 [-1 -1]:
# 5 [-1 -1]:
# 6 [-1 -1]:
# 7 [-1 -1]:
# 8 [-1 -1]:
# 9 [-1 -1]:
# 10 [ 5 23]: SELECT * FROM foo;
1. scheme : <one-scheme-found>
2. dsn : (null)
3. user : <user-name>
4. password : <none>
5. host : localhost
6. port : <scheme-default>
7. database : <user-name>
8. table : (null)
9. coloumn : (null)
10. sql : SELECT * FROM foo;
ERROR parsing 'err://1:::/1/1/'