Proposed patch:

commit 830ba62d179fca2ccf01d7900aa58676a4a17f9c
Author: David Christensen <[email protected]>
Date:   Sun Jan 8 22:16:40 2012 -0600

    allow hi-bit chars in dollar-quoted identifiers

diff --git a/dbdimp.c b/dbdimp.c
index 0c1d22f..b6f1235 100644
--- a/dbdimp.c
+++ b/dbdimp.c
@@ -1785,12 +1785,12 @@ static void pg_st_split_statement (pTHX_ imp_sth_t * 
imp_sth, int version, char
                        (*statement == '$' 
                         || *statement == '_'
                         || (*statement >= 'A' && *statement <= 'Z') 
-                        || (*statement >= 'a' && *statement <= 'z'))) {
+                        || (*statement >= 'a' && *statement <= 'z')
+                        || ((unsigned char)*statement >= (unsigned 
char)'\200'))) {
                        /* "SQL identifiers must begin with a letter (a-z, but 
also letters with diacritical marks and non-Latin letters) 
                 or an underscore (_). Subsequent characters in an identifier 
or key word can be letters, underscores, 
                 digits (0-9), or dollar signs ($)
                        */
-                       /* Postgres technically allows \200-\377 as well, but 
we don't */
                        sectionsize = 0; /* How far from the first dollar sign 
are we? */
                        found = 0; /* Have we found the end of the dollarquote? 
*/
 
@@ -1808,7 +1808,7 @@ static void pg_st_split_statement (pTHX_ imp_sth_t * 
imp_sth, int version, char
                                        || (ch >= 58 && ch <= 64)
                                        || (ch >= 91 && ch <= 94)
                                        || ch == 96
-                                       || (ch >= 123)) {
+                                       ) {
                                        break;
                                }
                        } /* end first scan */
diff --git a/t/12placeholders.t b/t/12placeholders.t
index f897b22..921f0f9 100644
--- a/t/12placeholders.t
+++ b/t/12placeholders.t
@@ -17,7 +17,7 @@ my $dbh = connect_database();
 if (! $dbh) {
        plan skip_all => 'Connection to database failed, cannot continue 
testing';
 }
-plan tests => 235;
+plan tests => 238;
 
 my $t='Connect to database for placeholder testing';
 isnt ($dbh, undef, $t);
@@ -553,6 +553,15 @@ for my $char (qw{0 9 A Z a z}) { ## six letters
        is ($@, q{}, $t);
 }
 
+for my $ident (qq{\x{5317}}, qq{abc\x{5317}}, qq{_cde\x{5317}}) { ## hi-bit 
chars
+       eval {
+               $sth = $dbh->prepare(qq{SELECT \$$ident\$ 123 \$$ident\$});
+               $sth->execute();
+               $sth->finish();
+       };
+       is ($@, q{}, $t);
+}
+
 }
 
 SKIP: {


Regards,

David
--
David Christensen
End Point Corporation
[email protected]




Reply via email to