From: Felipe Pena Date: Thu, 23 Oct 2008 18:53:05 +0000 (+0000) Subject: - MFH: Fixed bug #43925 (Incorrect argument counter in prepared statements with pgsql) X-Git-Tag: BEFORE_NS_RULES_CHANGE~180 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=981a23fff3d320d5f61c706dfa9c291ba65a6f3b;p=php - MFH: Fixed bug #43925 (Incorrect argument counter in prepared statements with pgsql) --- diff --git a/ext/pdo/pdo_sql_parser.c b/ext/pdo/pdo_sql_parser.c index 142242f60a..73fdd60db8 100644 --- a/ext/pdo/pdo_sql_parser.c +++ b/ext/pdo/pdo_sql_parser.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Fri Oct 10 08:59:42 2008 */ +/* Generated by re2c 0.13.5 on Thu Oct 23 15:07:48 2008 */ #line 1 "ext/pdo/pdo_sql_parser.re" /* +----------------------------------------------------------------------+ @@ -553,6 +553,7 @@ rewrite: char idxbuf[32]; const char *tmpl = stmt->named_rewrite_template ? stmt->named_rewrite_template : ":pdo%d"; char *name; + int bind_no = 1; newbuffer_len = inquery_len; @@ -568,7 +569,7 @@ rewrite: /* check if bound parameter is already available */ if (!strcmp(name, "?") || zend_hash_find(stmt->bound_param_map, name, plc->len + 1, (void**) &p) == FAILURE) { - snprintf(idxbuf, sizeof(idxbuf), tmpl, plc->bindno + 1); + snprintf(idxbuf, sizeof(idxbuf), tmpl, bind_no++); } else { memset(idxbuf, 0, sizeof(idxbuf)); memcpy(idxbuf, p, sizeof(idxbuf)); diff --git a/ext/pdo/pdo_sql_parser.re b/ext/pdo/pdo_sql_parser.re index 88fbb6055f..ac2e9905c1 100644 --- a/ext/pdo/pdo_sql_parser.re +++ b/ext/pdo/pdo_sql_parser.re @@ -302,6 +302,7 @@ rewrite: char idxbuf[32]; const char *tmpl = stmt->named_rewrite_template ? stmt->named_rewrite_template : ":pdo%d"; char *name; + int bind_no = 1; newbuffer_len = inquery_len; @@ -317,7 +318,7 @@ rewrite: /* check if bound parameter is already available */ if (!strcmp(name, "?") || zend_hash_find(stmt->bound_param_map, name, plc->len + 1, (void**) &p) == FAILURE) { - snprintf(idxbuf, sizeof(idxbuf), tmpl, plc->bindno + 1); + snprintf(idxbuf, sizeof(idxbuf), tmpl, bind_no++); } else { memset(idxbuf, 0, sizeof(idxbuf)); memcpy(idxbuf, p, sizeof(idxbuf)); diff --git a/ext/pdo_pgsql/tests/bug43925.phpt b/ext/pdo_pgsql/tests/bug43925.phpt new file mode 100644 index 0000000000..e22ffba041 --- /dev/null +++ b/ext/pdo_pgsql/tests/bug43925.phpt @@ -0,0 +1,59 @@ +--TEST-- +Bug #43925 (Incorrect argument counter in prepared statements with pgsql) +--SKIPIF-- + +--FILE-- +query('DROP TABLE nodes'); + +$dbh->query(' +CREATE TABLE nodes +( + id integer NOT NULL PRIMARY KEY + , root integer NOT NULL + , lft integer NOT NULL + , rgt integer NOT NULL +);'); + +$dbh->query('INSERT INTO nodes (id, root, lft, rgt) VALUES (1, 1, 1, 6);'); +$dbh->query('INSERT INTO nodes (id, root, lft, rgt) VALUES (2, 1, 2, 3);'); +$dbh->query('INSERT INTO nodes (id, root, lft, rgt) VALUES (3, 1, 4, 5);'); + + +$stmt = $dbh->prepare(' + SELECT * + FROM nodes + WHERE (:rootId > 0 OR lft > :left OR rgt > :left) + AND (root = :rootId OR root = :left) + AND (1 > :left OR 1 < :left OR 1 = :left) + AND (:x > 0 OR :x < 10 OR :x > 100) + OR :y = 1 OR :left = 1 +'); + +$stmt->bindValue('left', 1, PDO::PARAM_INT); +$stmt->bindValue('rootId', 3, PDO::PARAM_INT); +$stmt->bindValue('x', 5, PDO::PARAM_INT); +$stmt->bindValue('y', 50, PDO::PARAM_INT); + +$stmt->execute(); + +foreach ($stmt->fetchAll() as $row) { + print implode(' - ', $row); + print "\n"; +} + +$dbh->query('DROP TABLE nodes'); + +?> +--EXPECTF-- +1 - 1 - 1 - 1 - 1 - 1 - 6 - 6 +2 - 2 - 1 - 1 - 2 - 2 - 3 - 3 +3 - 3 - 1 - 1 - 4 - 4 - 5 - 5