Index: /lang/perl/Filter-SQL/trunk/t/01-simple.t
===================================================================
--- /lang/perl/Filter-SQL/trunk/t/01-simple.t (revision 21488)
+++ /lang/perl/Filter-SQL/trunk/t/01-simple.t (revision 22663)
@@ -10,5 +10,5 @@
         plan skip_all => 'Set FILTER_SQL_DBI to run these tests';
     } else {
-        plan tests => 32;
+        plan tests => 35;
     }
 };
@@ -40,4 +40,8 @@
     [],
 );
+is_deeply(
+    { SELECT ROW AS HASH * FROM filter_sql_t; },
+    {},
+);
 
 is_deeply(
@@ -60,4 +64,9 @@
 );
 
+is_deeply(
+    { SELECT ROW AS HASH * FROM filter_sql_t; },
+    { v => 0 },
+);
+
 my $sth = EXEC SELECT v FROM filter_sql_t;;
 ok($sth);
@@ -70,4 +79,8 @@
     [ SELECT * FROM filter_sql_t; ],
     [ [ 0 ], [ 1 ], [ 2 ], ],
+);
+is_deeply(
+    [ SELECT AS HASH * FROM filter_sql_t; ],
+    [ { v => 0 }, { v => 1 }, { v => 2 }, ],
 );
 is(SELECT ROW COUNT(*) FROM filter_sql_t;, 3);
Index: /lang/perl/Filter-SQL/trunk/lib/Filter/SQL.pm
===================================================================
--- /lang/perl/Filter-SQL/trunk/lib/Filter/SQL.pm (revision 21488)
+++ /lang/perl/Filter-SQL/trunk/lib/Filter/SQL.pm (revision 22663)
@@ -16,9 +16,9 @@
 $EXPORT_TAGS{all} = [ uniq map { @$_ } values %EXPORT_TAGS ];
 our @EXPORT_OK = @{$EXPORT_TAGS{all}};
-our $VERSION = '0.09';
+our $VERSION = '0.10';
 
 FILTER_ONLY
     code => sub {
-        s{(EXEC\s+(?:\S+)|SELECT\s+ROW|SELECT|INSERT|UPDATE|DELETE|REPLACE) ([^;]*);}{'Filter::SQL->' . Filter::SQL::to_func($1) . quote_vars($2) . ")"}egm;
+        s{(EXEC\s+(?:\S+)|SELECT(?:\s+ROW|)(?:\s+AS\s+HASH|)|INSERT|UPDATE|DELETE|REPLACE)\s+([^;]*);}{'Filter::SQL->' . Filter::SQL::to_func($1) . quote_vars($2) . ")"}egm;
 #        print STDERR $_; $_;
     };
@@ -29,8 +29,11 @@
     if ($op =~ /^EXEC\s+/) {
         return "sql_prepare_exec('$' ";
-    } elsif ($op =~ /^SELECT\s+ROW/) {
-        return "sql_selectrow('SELECT ";
-    } elsif ($op eq 'SELECT') {
-        return "sql_selectall('SELECT ";
+    } elsif ($op =~ /^SELECT(\s+ROW|)(\s+AS\s+HASH|)/) {
+        my $as_hash = $2 ? '1' : 'undef';
+        if ($1) {
+            return "sql_selectrow($as_hash, 'SELECT ";
+        } else {
+            return "sql_selectall($as_hash, 'SELECT ";
+        }
     } else {
         return "sql_prepare_exec('$op ";
@@ -124,8 +127,12 @@
 
 sub sql_selectall {
-    my ($klass, $sql, @params) = @_;
+    my ($klass, $as_hash, $sql, @params) = @_;
     my $pe = Filter::SQL->dbh->{PrintError};
     local Filter::SQL->dbh->{PrintError} = undef;
-    my $rows = Filter::SQL->dbh->selectall_arrayref($sql, {}, @params);
+    my $rows = Filter::SQL->dbh->selectall_arrayref(
+        $sql,
+        $as_hash ? { Slice => {} } : {},
+        @params,
+    );
     unless ($rows) {
         carp Filter::SQL->dbh->errstr if $pe;
@@ -136,12 +143,18 @@
 
 sub sql_selectrow {
-    my ($klass, $sql, @params) = @_;
+    my ($klass, $as_hash, $sql, @params) = @_;
     my $pe = Filter::SQL->dbh->{PrintError};
     local Filter::SQL->dbh->{PrintError} = undef;
-    my $rows = Filter::SQL->dbh->selectall_arrayref($sql, {}, @params);
+    my $rows = Filter::SQL->dbh->selectall_arrayref(
+        $sql,
+        $as_hash ? { Slice => {} } : {},
+        @params,
+    );
     unless ($rows) {
         carp Filter::SQL->dbh->errstr if $pe;
         return;
     }
+    return @$rows ? %{$rows->[0]} : ()
+        if $as_hash;
     @$rows ? wantarray ? @{$rows->[0]} : $rows->[0][0] : ();
 }
@@ -174,5 +187,5 @@
   $v = 12345;
   INSERT INTO t (v) VALUES ($v);;
-  
+
   foreach my $row (SELECT * FROM t;) {
       print "v: $row[0]\n";
@@ -181,4 +194,11 @@
   if (SELECT ROW COUNT(*) FROM t; == 1) {
       print "1 row in table\n";
+  }
+
+  foreach my $row (SELECT AS HASH * FROM t;) {
+      print "---\n";
+      foreach my $name (sort keys %$row) {
+          print "$name: $row->{$name}\n";
+      }
   }
 
Index: /lang/perl/Filter-SQL/trunk/Changes
===================================================================
--- /lang/perl/Filter-SQL/trunk/Changes (revision 21488)
+++ /lang/perl/Filter-SQL/trunk/Changes (revision 22663)
@@ -1,3 +1,6 @@
 Revision history for Perl extension Filter::SQL.
+
+0.10  Tue Nov 04 11:00:00 2008
+	- implement ``SELECT AS HASH'' directive
 
 0.09  Fri Oct 17 15:55:00 2008
