[svn:DBD-Pg] r13162 - in DBD-Pg/trunk: . t

[email protected]
Newsgroups gmane.comp.db.postgresql.dbdpg.cvs
Message-ID <[email protected]>
Author: turnstep
Date: Tue Aug  4 11:10:35 2009
New Revision: 13162

Modified:
   DBD-Pg/trunk/Pg.xs
   DBD-Pg/trunk/dbdimp.c
   DBD-Pg/trunk/dbdimp.h
   DBD-Pg/trunk/t/09arrays.t
   DBD-Pg/trunk/t/dbdpg_test_setup.pl

Log:
Fix and additinal tests for bug 48420: single quotes when quoting arrays.


Modified: DBD-Pg/trunk/Pg.xs
==============================================================================
--- DBD-Pg/trunk/Pg.xs	(original)
+++ DBD-Pg/trunk/Pg.xs	Tue Aug  4 11:10:35 2009
@@ -205,7 +205,7 @@
 		else if (SvROK(to_quote_sv) && !SvAMAGIC(to_quote_sv)) {
 			if (SvTYPE(SvRV(to_quote_sv)) != SVt_PVAV)
 				croak("Cannot quote a reference");
-			RETVAL = pg_stringify_array(to_quote_sv, ",", imp_dbh->pg_server_version);
+			RETVAL = pg_stringify_array(to_quote_sv, ",", imp_dbh->pg_server_version, 1);
 		}
 		else {
 			sql_type_info_t *type_info;

Modified: DBD-Pg/trunk/dbdimp.c
==============================================================================
--- DBD-Pg/trunk/dbdimp.c	(original)
+++ DBD-Pg/trunk/dbdimp.c	Tue Aug  4 11:10:35 2009
@@ -2246,7 +2246,7 @@
 		}
 		else if (SvTYPE(SvRV(newvalue)) == SVt_PVAV) {
 			SV * quotedval;
-			quotedval = pg_stringify_array(newvalue,",",imp_dbh->pg_server_version);
+			quotedval = pg_stringify_array(newvalue,",",imp_dbh->pg_server_version, 0);
 			currph->valuelen = sv_len(quotedval);
 			Renew(currph->value, currph->valuelen+1, char); /* freed in dbd_st_destroy */
 			currph->value = SvUTF8(quotedval) ? SvPVutf8_nolen(quotedval) : SvPV_nolen(quotedval);
@@ -2380,7 +2380,7 @@
 
 
 /* ================================================================== */
-SV * pg_stringify_array(SV *input, const char * array_delim, int server_version) {
+SV * pg_stringify_array(SV *input, const char * array_delim, int server_version, int extraquotes) {
 
 	dTHX;
 	AV * toparr;
@@ -2399,12 +2399,14 @@
 	if (TSTART) TRC(DBILOGFP, "%sBegin pg_stringify_array\n", THEADER);
 
 	toparr = (AV *) SvRV(input);
-	value = newSVpv("{", 1);
+	value = extraquotes ? newSVpv("'{", 2) : newSVpv("{", 1);
 
 	/* Empty arrays are easy */
 	if (av_len(toparr) < 0) {
 		av_clear(toparr);
 		sv_catpv(value, "}");
+		if (extraquotes)
+			sv_catpv(value, "'");
 		if (TEND) TRC(DBILOGFP, "%sEnd pg_stringify_array (empty)\n", THEADER);
 		return value;
 	}
@@ -2506,6 +2508,8 @@
 	for (xy=0; xy<array_depth; xy++) {
 		sv_catpv(value, "}");
 	}
+	if (extraquotes)
+		sv_catpv(value, "'");
 
 	if (TEND) TRC(DBILOGFP, "%sEnd pg_stringify_array (string: %s)\n", THEADER, neatsvpv(value,0));
 	return value;

Modified: DBD-Pg/trunk/dbdimp.h
==============================================================================
--- DBD-Pg/trunk/dbdimp.h	(original)
+++ DBD-Pg/trunk/dbdimp.h	Tue Aug  4 11:10:35 2009
@@ -187,7 +187,7 @@
 
 SV * pg_db_pg_notifies (SV *dbh, imp_dbh_t *imp_dbh);
 
-SV * pg_stringify_array(SV * input, const char * array_delim, int server_version);
+SV * pg_stringify_array(SV * input, const char * array_delim, int server_version, int extraquotes);
 
 int pg_quickexec (SV *dbh, const char *sql, const int asyncflag);
 

Modified: DBD-Pg/trunk/t/09arrays.t
==============================================================================
--- DBD-Pg/trunk/t/09arrays.t	(original)
+++ DBD-Pg/trunk/t/09arrays.t	Tue Aug  4 11:10:35 2009
@@ -18,7 +18,7 @@
 if (! defined $dbh) {
 	plan skip_all => 'Connection to database failed, cannot continue testing';
 }
-plan tests => 256;
+plan tests => 257;
 
 isnt ($dbh, undef, 'Connect to database for array testing');
 
@@ -51,6 +51,17 @@
 $SQL = q{SELECT testarray3 FROM dbd_pg_test WHERE pname= 'Array Testing'};
 my $getarray_bool = $dbh->prepare($SQL);
 
+$t='Array quoting allows direct insertion into statements';
+$SQL = q{INSERT INTO dbd_pg_test (id,testarray2) VALUES };
+my $quoteid = $dbh->quote(123);
+my $quotearr = $dbh->quote([456]);
+$SQL .= qq{($quoteid, $quotearr)};
+eval {
+	$dbh->do($SQL);
+};
+is ($@, q{}, $t);
+$dbh->rollback();
+
 ## Input
 ## Expected
 ## Name of test
@@ -201,6 +212,9 @@
 	if ($expected =~ s/\s*quote:\s*(.+)//) {
 		$qexpected = $1;
 	}
+	if ($qexpected !~ /^ERROR/) {
+		$qexpected = qq{'$qexpected'};
+	}
 
 	if ($msg =~ s/NEED (\d+):\s*//) {
 		my $ver = $1;
@@ -568,7 +582,7 @@
 
 	$t='quote() handles utf8 inside array';
 	$quoted = $dbh->quote([$utf8_str, $utf8_str]);
-	is ($quoted, qq!{"$utf8_str","$utf8_str"}!, $t);
+	is ($quoted, qq!'{"$utf8_str","$utf8_str"}'!, $t);
 
 	$t='Quoted array of strings should be UTF-8';
     ok (Encode::is_utf8( $quoted ), $t);
@@ -581,7 +595,7 @@
 
 	$t='Inserting utf-8 into an array via quoted do() works';
 	$dbh->do('DELETE FROM dbd_pg_test');
-	$SQL = qq{INSERT INTO dbd_pg_test (id, testarray, val) VALUES (1, '$quoted', 'one')};
+	$SQL = qq{INSERT INTO dbd_pg_test (id, testarray, val) VALUES (1, $quoted, 'one')};
 	eval {
 		$dbh->do($SQL);
 	};

Modified: DBD-Pg/trunk/t/dbdpg_test_setup.pl
==============================================================================
--- DBD-Pg/trunk/t/dbdpg_test_setup.pl	(original)
+++ DBD-Pg/trunk/t/dbdpg_test_setup.pl	Tue Aug  4 11:10:35 2009
@@ -398,7 +398,12 @@
 			$@ = qq{Could not open "$conf": $!};
 			last GETHANDLE; ## Fail - no conf file
 		}
-		print $cfh "\n\n## DBD::Pg testing parameters\nport=$testport\nmax_connections=4\n";
+		print $cfh "\n\n## DBD::Pg testing parameters\n";
+		print $cfh "port=$testport\n";
+		print $cfh "max_connections=4\n";
+		print $cfh "log_statement = 'all'\n";
+		print $cfh "log_line_prefix = '%m [%p] '\n";
+		print $cfh "log_min_messages = 'DEBUG1'\n";
 		print $cfh "listen_addresses='127.0.0.1'\n" if $^O =~ /Win32/;
 		print $cfh "\n";
 		close $cfh or die qq{Could not close "$conf": $!\n};
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.