sql: RFC3986 calls the statement part a query. Let's do that, too.

sql: test sql02 and results.
This commit is contained in:
Ole Tange 2010-09-10 00:58:34 +02:00
parent 944a4fdd4f
commit e63e97916c
3 changed files with 117 additions and 16 deletions

34
src/sql
View file

@ -149,21 +149,21 @@ For this to work B<--shebang> or B<-Y> must be set as the first option.
=head1 DBURL
A DBURL has the following syntax:
[sql:]vendor://[user[:password]@][host][:port]/[database][?sqlstatement]
[sql:]vendor://[user[:password]@][host][:port]/[database][?sqlquery]
Examples:
mysql://user:pa55w0rd@mysqlserver/database
sql:oracle://scott:tiger@oracleserver/xe
postgresql://user:pa55w0rd@pg.example.com/db
pg:///
sqlite2:////tmp/db.sqlite?select * from foo;
sql:sqlite2:////tmp/db.sqlite?select * from foo;
sqlite3:///../db.sqlite3?select%20*%20from%20foo;
Currently supported vendors: MySQL (mysql), MySQL with SSL (mysqls,
mysqlssl), Oracle (oracle, ora), PostgreSQL (postgresql, pg, pgsql,
postgres), PostgreSQL with SSL (postgresqlssl, pgs, pgsqlssl,
postgresssl, pgssl, postgresqls, pgsqls, postgress), SQLite (sqlite2,
sqlite3).
postgresssl, pgssl, postgresqls, pgsqls, postgress), SQLite2 (sqlite,
sqlite2), SQLite3 (sqlite3).
Aliases must start with ':' and are read from
/etc/sql/aliases and ~/.sql/aliases. The user's own
@ -181,8 +181,8 @@ Example of aliases:
:m :myalias4
# the sortest alias possible
: sqlite2:////tmp/mydefault.sqlite
# Including an SQL statement
:stm sqlite:////tmp/file.sqlite?select * from foo;
# Including an SQL query
:query sqlite:////tmp/file.sqlite?select * from foo;
=head1 EXAMPLES
@ -333,9 +333,11 @@ A copy of the full license is included in the file as cc-by-sa.txt.
=head1 DEPENDENCIES
GNU B<sql> uses Perl. If B<mysql> is installed, MySQL dburls will
work. If B<psql> is installed, PostgreSQL dburls will work. If
B<sqlplus> is installed, Oracle dburls will work. If B<rlwrap> is
installed, GNU B<sql> will have a command history for Oracle.
work. If B<psql> is installed, PostgreSQL dburls will work. If
B<sqlite> is installed, SQLite2 dburls will work. If B<sqlite3> is
installed, SQLite3 dburls will work. If B<sqlplus> is installed,
Oracle dburls will work. If B<rlwrap> is installed, GNU B<sql> will
have a command history for Oracle.
=head1 FILES
@ -347,7 +349,7 @@ installed, GNU B<sql> will have a command history for Oracle.
=head1 SEE ALSO
B<mysql>(1), B<psql>(1), B<sqlplus>(1), B<rlwrap>(1)
B<mysql>(1), B<psql>(1), B<rlwrap>(1), B<sqlite>(1), B<sqlite3>(1), B<sqlplus>(1)
=cut
@ -399,8 +401,8 @@ if(defined $::opt_tablesize) {
unshift @ARGV, tablesize($database_driver,%dburl);
}
if($dburl{'statement'}) {
unshift @ARGV,$dburl{'statement'};
if($dburl{'query'}) {
unshift @ARGV,$dburl{'query'};
}
do {
@ -779,7 +781,7 @@ sub check_permissions {
sub parse_dburl {
my $url = shift;
my %options = ();
# sql:mysql://[[user][:password]@][host][:port]/[database[?sql statement]]
# sql:mysql://[[user][:password]@][host][:port]/[database[?sql query]]
if($url=~m!(?:sql:)? # You can prefix with 'sql:'
((?:oracle|ora|mysql|pg|postgres|postgresql)(?:s|ssl|)|
@ -801,7 +803,7 @@ sub parse_dburl {
)?
(?:
\?
(.*)? # Statement ($7)
(.*)? # Query ($7)
)?
!x) {
$options{databasedriver} = undef_if_empty($1);
@ -810,12 +812,12 @@ sub parse_dburl {
$options{host} = undef_if_empty($4);
$options{port} = undef_if_empty($5);
$options{database} = undef_if_empty($6);
$options{statement} = undef_if_empty(uri_unescape($7));
$options{query} = undef_if_empty(uri_unescape($7));
debug("dburl $url\n");
debug("databasedriver ",$options{databasedriver}, " user ", $options{user},
" password ", $options{password}, " host ", $options{host},
" port ", $options{port}, " database ", $options{database},
" statement ",$options{statement}, "\n");
" query ",$options{query}, "\n");
} else {
Usage("$url is not a valid DBURL");
exit -1;

View file

@ -0,0 +1,26 @@
#!/bin/bash
cd /tmp
echo '### Test of sqlite'
for CMDSQL in sqlite sqlite3 ; do
echo "Current command: $CMDSQL"
rm -f sqltest.$CMDSQL
# create database & table
sql $CMDSQL:///sqltest.$CMDSQL "CREATE TABLE foo(n INT, t TEXT);"
file sqltest.$CMDSQL
sql $CMDSQL:///sqltest.$CMDSQL "INSERT INTO foo VALUES(1,'Line 1');"
sql $CMDSQL:///sqltest.$CMDSQL "INSERT INTO foo VALUES(2,'Line 2');"
sql $CMDSQL:///sqltest.$CMDSQL "SELECT * FROM foo;"
sql -n $CMDSQL:///sqltest.$CMDSQL "SELECT * FROM foo;"
sql -s '.' $CMDSQL:///sqltest.$CMDSQL "SELECT * FROM foo;"
sql -n -s '.' $CMDSQL:///sqltest.$CMDSQL "SELECT * FROM foo;"
sql -s '' $CMDSQL:///sqltest.$CMDSQL "SELECT * FROM foo;"
sql -s ' ' $CMDSQL:///sqltest.$CMDSQL "SELECT * FROM foo;"
sql --html $CMDSQL:///sqltest.$CMDSQL "SELECT * FROM foo;"
sql -n --html $CMDSQL:///sqltest.$CMDSQL "SELECT * FROM foo;"
sql --dbsize $CMDSQL:///sqltest.$CMDSQL
sql $CMDSQL:///sqltest.$CMDSQL "DROP TABLE foo;"
sql --dbsize $CMDSQL:///sqltest.$CMDSQL
rm -f sqltest.$CMDSQL
done

View file

@ -0,0 +1,73 @@
### Test of sqlite
Current command: sqlite
sqltest.sqlite: SQLite 2.x database
n|t
1|Line 1
2|Line 2
1|Line 1
2|Line 2
n.t
1.Line 1
2.Line 2
1.Line 1
2.Line 2
nt
1Line 1
2Line 2
n t
1 Line 1
2 Line 2
<TR><TH>n</TH><TH>t</TH></TR>
<TR><TD>1</TD>
<TD>Line 1</TD>
</TR>
<TR><TD>2</TD>
<TD>Line 2</TD>
</TR>
<TR><TD>1</TD>
<TD>Line 1</TD>
</TR>
<TR><TD>2</TD>
<TD>Line 2</TD>
</TR>
bytes
3072
bytes
3072
Current command: sqlite3
sqltest.sqlite3: SQLite 3.x database
n|t
1|Line 1
2|Line 2
1|Line 1
2|Line 2
n.t
1.Line 1
2.Line 2
1.Line 1
2.Line 2
nt
1Line 1
2Line 2
n t
1 Line 1
2 Line 2
<TR><TH>n</TH>
<TH>t</TH>
</TR>
<TR><TD>1</TD>
<TD>Line 1</TD>
</TR>
<TR><TD>2</TD>
<TD>Line 2</TD>
</TR>
<TR><TD>1</TD>
<TD>Line 1</TD>
</TR>
<TR><TD>2</TD>
<TD>Line 2</TD>
</TR>
bytes
2048
bytes
2048