Tom Lane wrote:
> A subsidiary point here is that pg_atoi() explicitly takes a zero-length
> string as valid input of value 0. I think this is quite bogus myself,
> but I don't know why that behavior was put in or whether we'd be breaking
> anything if we tightened it up.
I have attached a patch the throws an error if pg_atoi() is passed a
zero-length string, and have included regression diffs showing the
effects of the patch.
Seems the new code catches a few places that were bad, like defineing {}
for an array of 0,0. The copy2.out change is because pg_atoi catches
the problem before COPY does.
The tightening up of pg_atoi seems safe and makes sense to me.
If no adverse comments, I will apply and fix up the regression results.
--
Bruce Momjian | http://candle.pha.pa.us
[EMAIL PROTECTED] | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
Index: src/backend/utils/adt/numutils.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/utils/adt/numutils.c,v
retrieving revision 1.51
diff -c -c -r1.51 numutils.c
*** src/backend/utils/adt/numutils.c 16 Jul 2002 18:34:16 -0000 1.51
--- src/backend/utils/adt/numutils.c 27 Aug 2002 17:51:45 -0000
***************
*** 60,66 ****
if (s == (char *) NULL)
elog(ERROR, "pg_atoi: NULL pointer!");
else if (*s == 0)
! l = (long) 0;
else
l = strtol(s, &badp, 10);
--- 60,66 ----
if (s == (char *) NULL)
elog(ERROR, "pg_atoi: NULL pointer!");
else if (*s == 0)
! elog(ERROR, "pg_atoi: zero-length string!");
else
l = strtol(s, &badp, 10);
*** ./expected/arrays.out Thu Nov 29 16:02:41 2001
--- ./results/arrays.out Tue Aug 27 14:14:47 2002
***************
*** 16,21 ****
--- 16,22 ----
--
INSERT INTO arrtest (a[5], b[2][1][2], c, d, f, g)
VALUES ('{1,2,3,4,5}', '{{{},{1,2}}}', '{}', '{}', '{}', '{}');
+ ERROR: pg_atoi: zero-length string!
UPDATE arrtest SET e[0] = '1.1';
UPDATE arrtest SET e[1] = '2.2';
INSERT INTO arrtest (f)
***************
*** 29,39 ****
VALUES ('{}', '{3,4}', '{foo,bar}', '{bar,foo}');
SELECT * FROM arrtest;
a | b | c | d | e | f
| g
!
-------------+-----------------+-----------+---------------+-----------+-----------------+-------------
! {1,2,3,4,5} | {{{0,0},{1,2}}} | {} | {} | | {}
| {}
{11,12,23} | {{3,4},{4,5}} | {foobar} | {{elt1,elt2}} | {3.4,6.7} | {"abc
",abcde} | {abc,abcde}
{} | {3,4} | {foo,bar} | {bar,foo} | |
|
! (3 rows)
SELECT arrtest.a[1],
arrtest.b[1][1][1],
--- 30,39 ----
VALUES ('{}', '{3,4}', '{foo,bar}', '{bar,foo}');
SELECT * FROM arrtest;
a | b | c | d | e | f
| g
!
------------+---------------+-----------+---------------+-----------+-----------------+-------------
{11,12,23} | {{3,4},{4,5}} | {foobar} | {{elt1,elt2}} | {3.4,6.7} | {"abc
",abcde} | {abc,abcde}
{} | {3,4} | {foo,bar} | {bar,foo} | |
|
! (2 rows)
SELECT arrtest.a[1],
arrtest.b[1][1][1],
***************
*** 43,61 ****
FROM arrtest;
a | b | c | d | e
----+---+--------+------+---
- 1 | 0 | | |
11 | | foobar | elt1 |
| | foo | |
! (3 rows)
SELECT a[1], b[1][1][1], c[1], d[1][1], e[0]
FROM arrtest;
a | b | c | d | e
----+---+--------+------+---
- 1 | 0 | | |
11 | | foobar | elt1 |
| | foo | |
! (3 rows)
SELECT a[1:3],
b[1:1][1:2][1:2],
--- 43,59 ----
FROM arrtest;
a | b | c | d | e
----+---+--------+------+---
11 | | foobar | elt1 |
| | foo | |
! (2 rows)
SELECT a[1], b[1][1][1], c[1], d[1][1], e[0]
FROM arrtest;
a | b | c | d | e
----+---+--------+------+---
11 | | foobar | elt1 |
| | foo | |
! (2 rows)
SELECT a[1:3],
b[1:1][1:2][1:2],
***************
*** 63,82 ****
d[1:1][1:2]
FROM arrtest;
a | b | c | d
! ------------+-----------------+-----------+---------------
! {1,2,3} | {{{0,0},{1,2}}} | |
{11,12,23} | | {foobar} | {{elt1,elt2}}
| | {foo,bar} |
! (3 rows)
SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c
FROM arrtest;
a | b | c
! -------+-----------------+-------
! [1:5] | [1:1][1:2][1:2] |
[1:3] | [1:2][1:2] | [1:1]
| [1:2] | [1:2]
! (3 rows)
-- returns nothing
SELECT *
--- 61,78 ----
d[1:1][1:2]
FROM arrtest;
a | b | c | d
! ------------+---+-----------+---------------
{11,12,23} | | {foobar} | {{elt1,elt2}}
| | {foo,bar} |
! (2 rows)
SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c
FROM arrtest;
a | b | c
! -------+------------+-------
[1:3] | [1:2][1:2] | [1:1]
| [1:2] | [1:2]
! (2 rows)
-- returns nothing
SELECT *
***************
*** 99,109 ****
WHERE array_dims(c) is not null;
SELECT a,b,c FROM arrtest;
a | b | c
! ---------------+-----------------------+-------------------
! {16,25,3,4,5} | {{{113,142},{1,147}}} | {}
{} | {3,4} | {foo,new_word}
{16,25,23} | {{3,4},{4,5}} | {foobar,new_word}
! (3 rows)
SELECT a[1:3],
b[1:1][1:2][1:2],
--- 95,104 ----
WHERE array_dims(c) is not null;
SELECT a,b,c FROM arrtest;
a | b | c
! ------------+---------------+-------------------
{} | {3,4} | {foo,new_word}
{16,25,23} | {{3,4},{4,5}} | {foobar,new_word}
! (2 rows)
SELECT a[1:3],
b[1:1][1:2][1:2],
***************
*** 111,119 ****
d[1:1][2:2]
FROM arrtest;
a | b | c | d
! ------------+-----------------------+-------------------+----------
! {16,25,3} | {{{113,142},{1,147}}} | |
| | {foo,new_word} |
{16,25,23} | | {foobar,new_word} | {{elt2}}
! (3 rows)
--- 106,113 ----
d[1:1][2:2]
FROM arrtest;
a | b | c | d
! ------------+---+-------------------+----------
| | {foo,new_word} |
{16,25,23} | | {foobar,new_word} | {{elt2}}
! (2 rows)
======================================================================
*** ./expected/copy2.out Wed Aug 21 22:25:28 2002
--- ./results/copy2.out Tue Aug 27 14:15:50 2002
***************
*** 34,40 ****
ERROR: Attribute "d" specified more than once
-- missing data: should fail
COPY x from stdin;
! ERROR: copy: line 1, Missing data for column "b"
lost synchronization with server, resetting connection
COPY x from stdin;
ERROR: copy: line 1, Missing data for column "e"
--- 34,40 ----
ERROR: Attribute "d" specified more than once
-- missing data: should fail
COPY x from stdin;
! ERROR: copy: line 1, pg_atoi: zero-length string!
lost synchronization with server, resetting connection
COPY x from stdin;
ERROR: copy: line 1, Missing data for column "e"
======================================================================
---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly