Re: Escape handling in strings - Mailing list pgsql-patches
From | Christopher Kings-Lynne |
---|---|
Subject | Re: Escape handling in strings |
Date | |
Msg-id | 42B0E6DF.2010209@familyhealth.com.au Whole thread Raw |
In response to | Escape handling in strings (Bruce Momjian <pgman@candle.pha.pa.us>) |
Responses |
Re: Escape handling in strings
|
List | pgsql-patches |
I'm still really iffy about this. I think it will really hurt pgsql due to backward compatibility :( (If I'm understanding how the proposed change works...) Chris Bruce Momjian wrote: > A summary of my proposal to add a new E'' string for escape and have > non-E escapes not handle backslashes specially is at: > > http://candle.pha.pa.us/cgi-bin/pgescape > > Attached is a patch that emits warnings for \ and \', perhaps for 8.1. > The change to scan.l is the place this is done. The rest of the patch > is adjustments to prevent our own code from generating warnings. It > shows a good example of how users would have to change their code. > > It passes all regression tests, contrib regression, and initdb runs > without warning. > > > > ------------------------------------------------------------------------ > > Index: contrib/tsearch2/expected/tsearch2.out > =================================================================== > RCS file: /cvsroot/pgsql/contrib/tsearch2/expected/tsearch2.out,v > retrieving revision 1.11 > diff -c -c -r1.11 tsearch2.out > *** contrib/tsearch2/expected/tsearch2.out 14 Sep 2004 03:58:54 -0000 1.11 > --- contrib/tsearch2/expected/tsearch2.out 16 Jun 2005 01:36:54 -0000 > *************** > *** 47,83 **** > '1' '2' > (1 row) > > ! SELECT '\'1 2\''::tsvector; > tsvector > ---------- > '1 2' > (1 row) > > ! SELECT '\'1 \\\'2\''::tsvector; > tsvector > ---------- > '1 \'2' > (1 row) > > ! SELECT '\'1 \\\'2\'3'::tsvector; > tsvector > ------------- > '3' '1 \'2' > (1 row) > > ! SELECT '\'1 \\\'2\' 3'::tsvector; > tsvector > ------------- > '3' '1 \'2' > (1 row) > > ! SELECT '\'1 \\\'2\' \' 3\' 4 '::tsvector; > tsvector > ------------------ > '4' ' 3' '1 \'2' > (1 row) > > ! select '\'w\':4A,3B,2C,1D,5 a:8'; > ?column? > ----------------------- > 'w':4A,3B,2C,1D,5 a:8 > --- 47,83 ---- > '1' '2' > (1 row) > > ! SELECT '''1 2'''::tsvector; > tsvector > ---------- > '1 2' > (1 row) > > ! SELECT E'''1 \\''2'''::tsvector; > tsvector > ---------- > '1 \'2' > (1 row) > > ! SELECT E'''1 \\''2''3'::tsvector; > tsvector > ------------- > '3' '1 \'2' > (1 row) > > ! SELECT E'''1 \\''2'' 3'::tsvector; > tsvector > ------------- > '3' '1 \'2' > (1 row) > > ! SELECT E'''1 \\''2'' '' 3'' 4 '::tsvector; > tsvector > ------------------ > '4' ' 3' '1 \'2' > (1 row) > > ! select '''w'':4A,3B,2C,1D,5 a:8'; > ?column? > ----------------------- > 'w':4A,3B,2C,1D,5 a:8 > *************** > *** 126,138 **** > '1' > (1 row) > > ! SELECT '\'1 2\''::tsquery; > tsquery > --------- > '1 2' > (1 row) > > ! SELECT '\'1 \\\'2\''::tsquery; > tsquery > --------- > '1 \'2' > --- 126,138 ---- > '1' > (1 row) > > ! SELECT '''1 2'''::tsquery; > tsquery > --------- > '1 2' > (1 row) > > ! SELECT E'''1 \\''2'''::tsquery; > tsquery > --------- > '1 \'2' > *************** > *** 330,342 **** > '1' & '2' & '4' & ( '5' | !'6' ) > (1 row) > > ! SELECT '1&(\'2\'&(\' 4\'&(\\|5 | \'6 \\\' !|&\')))'::tsquery; > tsquery > ------------------------------------------ > '1' & '2' & ' 4' & ( '|5' | '6 \' !|&' ) > (1 row) > > ! SELECT '\'the wether\':dc & \' sKies \':BC & a:d b:a'; > ?column? > ------------------------------------------ > 'the wether':dc & ' sKies ':BC & a:d b:a > --- 330,342 ---- > '1' & '2' & '4' & ( '5' | !'6' ) > (1 row) > > ! SELECT E'1&(''2''&('' 4''&(\\|5 | ''6 \\'' !|&'')))'::tsquery; > tsquery > ------------------------------------------ > '1' & '2' & ' 4' & ( '|5' | '6 \' !|&' ) > (1 row) > > ! SELECT '''the wether'':dc & '' sKies '':BC & a:d b:a'; > ?column? > ------------------------------------------ > 'the wether':dc & ' sKies ':BC & a:d b:a > *************** > *** 382,388 **** > 23 | entity | HTML Entity > (23 rows) > > ! select * from parse('default', '345 qwe@efd.r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.netqwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>"> > /usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2readline-4.2. 234 > <i <b> wow < jqw <> qwerty'); > tokid | token > --- 382,388 ---- > 23 | entity | HTML Entity > (23 rows) > > ! select * from parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.netqwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>"> > /usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2readline-4.2. 234 > <i <b> wow < jqw <> qwerty'); > tokid | token > *************** > *** 529,535 **** > 1 | qwerty > (138 rows) > > ! SELECT to_tsvector('default', '345 qwe@efd.r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.netqwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>"> > /usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2readline-4.2. 234 > <i <b> wow < jqw <> qwerty'); > to_tsvector > --- 529,535 ---- > 1 | qwerty > (138 rows) > > ! SELECT to_tsvector('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.netqwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>"> > /usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2readline-4.2. 234 > <i <b> wow < jqw <> qwerty'); > to_tsvector > *************** > *** 543,549 **** > 2 > (1 row) > > ! SELECT length(to_tsvector('default', '345 qwe@efd.r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.netqwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>"> > /usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2readline-4.2. 234 > <i <b> wow < jqw <> qwerty')); > length > --- 543,549 ---- > 2 > (1 row) > > ! SELECT length(to_tsvector('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.netqwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>"> > /usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2readline-4.2. 234 > <i <b> wow < jqw <> qwerty')); > length > *************** > *** 563,569 **** > 'qwe' & 'skies' > (1 row) > > ! select to_tsquery('default', '\'the wether\':dc & \' sKies \':BC '); > to_tsquery > ------------------------ > 'wether':CD & 'sky':BC > --- 563,569 ---- > 'qwe' & 'skies' > (1 row) > > ! select to_tsquery('default', '''the wether'':dc & '' sKies '':BC '); > to_tsquery > ------------------------ > 'wether':CD & 'sky':BC > *************** > *** 729,735 **** > (1 row) > > drop trigger tsvectorupdate on test_tsvector; > ! create function wow(text) returns text as 'select $1 || \' copyright\'; ' language sql; > create trigger tsvectorupdate before update or insert on test_tsvector > for each row execute procedure tsearch2(a, wow, t); > insert into test_tsvector (t) values ('345 qwerty'); > --- 729,735 ---- > (1 row) > > drop trigger tsvectorupdate on test_tsvector; > ! create function wow(text) returns text as 'select $1 || '' copyright''; ' language sql; > create trigger tsvectorupdate before update or insert on test_tsvector > for each row execute procedure tsearch2(a, wow, t); > insert into test_tsvector (t) values ('345 qwerty'); > Index: contrib/tsearch2/sql/tsearch2.sql > =================================================================== > RCS file: /cvsroot/pgsql/contrib/tsearch2/sql/tsearch2.sql,v > retrieving revision 1.7 > diff -c -c -r1.7 tsearch2.sql > *** contrib/tsearch2/sql/tsearch2.sql 28 Jun 2004 16:18:56 -0000 1.7 > --- contrib/tsearch2/sql/tsearch2.sql 16 Jun 2005 01:36:54 -0000 > *************** > *** 12,23 **** > SELECT ' 1'::tsvector; > SELECT ' 1 '::tsvector; > SELECT '1 2'::tsvector; > ! SELECT '\'1 2\''::tsvector; > ! SELECT '\'1 \\\'2\''::tsvector; > ! SELECT '\'1 \\\'2\'3'::tsvector; > ! SELECT '\'1 \\\'2\' 3'::tsvector; > ! SELECT '\'1 \\\'2\' \' 3\' 4 '::tsvector; > ! select '\'w\':4A,3B,2C,1D,5 a:8'; > select 'a:3A b:2a'::tsvector || 'ba:1234 a:1B'; > select setweight('w:12B w:13* w:12,5,6 a:1,3* a:3 w asd:1dc asd zxc:81,567,222A'::tsvector, 'c'); > select strip('w:12B w:13* w:12,5,6 a:1,3* a:3 w asd:1dc asd'::tsvector); > --- 12,23 ---- > SELECT ' 1'::tsvector; > SELECT ' 1 '::tsvector; > SELECT '1 2'::tsvector; > ! SELECT '''1 2'''::tsvector; > ! SELECT E'''1 \\''2'''::tsvector; > ! SELECT E'''1 \\''2''3'::tsvector; > ! SELECT E'''1 \\''2'' 3'::tsvector; > ! SELECT E'''1 \\''2'' '' 3'' 4 '::tsvector; > ! select '''w'':4A,3B,2C,1D,5 a:8'; > select 'a:3A b:2a'::tsvector || 'ba:1234 a:1B'; > select setweight('w:12B w:13* w:12,5,6 a:1,3* a:3 w asd:1dc asd zxc:81,567,222A'::tsvector, 'c'); > select strip('w:12B w:13* w:12,5,6 a:1,3* a:3 w asd:1dc asd'::tsvector); > *************** > *** 28,35 **** > SELECT '1 '::tsquery; > SELECT ' 1'::tsquery; > SELECT ' 1 '::tsquery; > ! SELECT '\'1 2\''::tsquery; > ! SELECT '\'1 \\\'2\''::tsquery; > SELECT '!1'::tsquery; > SELECT '1|2'::tsquery; > SELECT '1|!2'::tsquery; > --- 28,35 ---- > SELECT '1 '::tsquery; > SELECT ' 1'::tsquery; > SELECT ' 1 '::tsquery; > ! SELECT '''1 2'''::tsquery; > ! SELECT E'''1 \\''2'''::tsquery; > SELECT '!1'::tsquery; > SELECT '1|2'::tsquery; > SELECT '1|!2'::tsquery; > *************** > *** 62,92 **** > SELECT '1&2&4&5&6'::tsquery; > SELECT '1&(2&(4&(5|6)))'::tsquery; > SELECT '1&(2&(4&(5|!6)))'::tsquery; > ! SELECT '1&(\'2\'&(\' 4\'&(\\|5 | \'6 \\\' !|&\')))'::tsquery; > ! SELECT '\'the wether\':dc & \' sKies \':BC & a:d b:a'; > > select lexize('simple', 'ASD56 hsdkf'); > select lexize('en_stem', 'SKIES Problems identity'); > > select * from token_type('default'); > ! select * from parse('default', '345 qwe@efd.r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.netqwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>"> > /usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2readline-4.2. 234 > <i <b> wow < jqw <> qwerty'); > > ! SELECT to_tsvector('default', '345 qwe@efd.r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.netqwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>"> > /usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2readline-4.2. 234 > <i <b> wow < jqw <> qwerty'); > > SELECT length(to_tsvector('default', '345 qw')); > > ! SELECT length(to_tsvector('default', '345 qwe@efd.r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.netqwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>"> > /usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2readline-4.2. 234 > <i <b> wow < jqw <> qwerty')); > > > select to_tsquery('default', 'qwe & sKies '); > select to_tsquery('simple', 'qwe & sKies '); > ! select to_tsquery('default', '\'the wether\':dc & \' sKies \':BC '); > select to_tsquery('default', 'asd&(and|fghj)'); > select to_tsquery('default', '(asd&and)|fghj'); > select to_tsquery('default', '(asd&!and)|fghj'); > --- 62,92 ---- > SELECT '1&2&4&5&6'::tsquery; > SELECT '1&(2&(4&(5|6)))'::tsquery; > SELECT '1&(2&(4&(5|!6)))'::tsquery; > ! SELECT E'1&(''2''&('' 4''&(\\|5 | ''6 \\'' !|&'')))'::tsquery; > ! SELECT '''the wether'':dc & '' sKies '':BC & a:d b:a'; > > select lexize('simple', 'ASD56 hsdkf'); > select lexize('en_stem', 'SKIES Problems identity'); > > select * from token_type('default'); > ! select * from parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.netqwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>"> > /usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2readline-4.2. 234 > <i <b> wow < jqw <> qwerty'); > > ! SELECT to_tsvector('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.netqwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>"> > /usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2readline-4.2. 234 > <i <b> wow < jqw <> qwerty'); > > SELECT length(to_tsvector('default', '345 qw')); > > ! SELECT length(to_tsvector('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.netqwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>"> > /usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2readline-4.2. 234 > <i <b> wow < jqw <> qwerty')); > > > select to_tsquery('default', 'qwe & sKies '); > select to_tsquery('simple', 'qwe & sKies '); > ! select to_tsquery('default', '''the wether'':dc & '' sKies '':BC '); > select to_tsquery('default', 'asd&(and|fghj)'); > select to_tsquery('default', '(asd&and)|fghj'); > select to_tsquery('default', '(asd&!and)|fghj'); > *************** > *** 135,141 **** > SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty'); > > drop trigger tsvectorupdate on test_tsvector; > ! create function wow(text) returns text as 'select $1 || \' copyright\'; ' language sql; > create trigger tsvectorupdate before update or insert on test_tsvector > for each row execute procedure tsearch2(a, wow, t); > insert into test_tsvector (t) values ('345 qwerty'); > --- 135,141 ---- > SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty'); > > drop trigger tsvectorupdate on test_tsvector; > ! create function wow(text) returns text as 'select $1 || '' copyright''; ' language sql; > create trigger tsvectorupdate before update or insert on test_tsvector > for each row execute procedure tsearch2(a, wow, t); > insert into test_tsvector (t) values ('345 qwerty'); > Index: src/backend/parser/scan.l > =================================================================== > RCS file: /cvsroot/pgsql/src/backend/parser/scan.l,v > retrieving revision 1.125 > diff -c -c -r1.125 scan.l > *** src/backend/parser/scan.l 15 Jun 2005 16:28:06 -0000 1.125 > --- src/backend/parser/scan.l 16 Jun 2005 01:36:55 -0000 > *************** > *** 49,54 **** > --- 49,55 ---- > > static int xcdepth = 0; /* depth of nesting in slash-star comments */ > static char *dolqstart; /* current $foo$ quote start string */ > + static bool warn_on_escape; > > /* > * literalbuf is used to accumulate literal values when multiple rules > *************** > *** 64,69 **** > --- 65,71 ---- > static void addlit(char *ytext, int yleng); > static void addlitchar(unsigned char ychar); > static char *litbufdup(void); > + static void check_escape_warning(void); > > /* > * When we parse a token that requires multiple lexer rules to process, > *************** > *** 185,190 **** > --- 187,196 ---- > /* National character */ > xnstart [nN]{quote} > > + /* Quote string does not warn about escapes */ > + xestart [eE]{quote} > + xeinside [^']* > + > /* Extended quote > * xqdouble implements embedded quote, '''' > */ > *************** > *** 410,415 **** > --- 416,428 ---- > } > > {xqstart} { > + warn_on_escape = true; > + token_start = yytext; > + BEGIN(xq); > + startlit(); > + } > + {xestart} { > + warn_on_escape = false; > token_start = yytext; > BEGIN(xq); > startlit(); > *************** > *** 428,441 **** > --- 441,468 ---- > addlit(yytext, yyleng); > } > <xq>{xqescape} { > + if (yytext[1] == '\'') > + { > + if (warn_on_escape) > + ereport(WARNING, > + (errcode(ERRCODE_INVALID_USE_OF_ESCAPE_CHARACTER), > + errmsg("Invalid use of \' in a normal string"), > + errhint("Use '' to place quotes in strings, or use E-type strings."))); > + } > + else > + check_escape_warning(); > addlitchar(unescape_single_char(yytext[1])); > } > <xq>{xqoctesc} { > unsigned char c = strtoul(yytext+1, NULL, 8); > + > + check_escape_warning(); > addlitchar(c); > } > <xq>{xqhexesc} { > unsigned char c = strtoul(yytext+2, NULL, 16); > + > + check_escape_warning(); > addlitchar(c); > } > <xq>{quotecontinue} { > *************** > *** 810,812 **** > --- 837,850 ---- > return c; > } > } > + > + static void > + check_escape_warning(void) > + { > + if (warn_on_escape) > + ereport(WARNING, > + (errcode(ERRCODE_INVALID_USE_OF_ESCAPE_CHARACTER), > + errmsg("Invalid use of escapes in a normal string"), > + errhint("Use E-type strings for escapes, e.g. E'\\r\\n'."))); > + warn_on_escape = false; /* warn only once per string */ > + } > Index: src/bin/initdb/initdb.c > =================================================================== > RCS file: /cvsroot/pgsql/src/bin/initdb/initdb.c,v > retrieving revision 1.83 > diff -c -c -r1.83 initdb.c > *** src/bin/initdb/initdb.c 30 Apr 2005 08:08:51 -0000 1.83 > --- src/bin/initdb/initdb.c 16 Jun 2005 01:36:57 -0000 > *************** > *** 1688,1694 **** > char **priv_lines; > static char *privileges_setup[] = { > "UPDATE pg_class " > ! " SET relacl = '{\"=r/\\\\\"$POSTGRES_SUPERUSERNAME\\\\\"\"}' " > " WHERE relkind IN ('r', 'v', 'S') AND relacl IS NULL;\n", > "GRANT USAGE ON SCHEMA pg_catalog TO PUBLIC;\n", > "GRANT CREATE, USAGE ON SCHEMA public TO PUBLIC;\n", > --- 1688,1694 ---- > char **priv_lines; > static char *privileges_setup[] = { > "UPDATE pg_class " > ! " SET relacl = E'{\"=r/\\\\\"$POSTGRES_SUPERUSERNAME\\\\\"\"}' " > " WHERE relkind IN ('r', 'v', 'S') AND relacl IS NULL;\n", > "GRANT USAGE ON SCHEMA pg_catalog TO PUBLIC;\n", > "GRANT CREATE, USAGE ON SCHEMA public TO PUBLIC;\n", > *************** > *** 1952,1959 **** > > for (i = 0, j = 0; i < len; i++) > { > ! if (src[i] == '\'' || src[i] == '\\') > result[j++] = '\\'; > result[j++] = src[i]; > } > result[j] = '\0'; > --- 1952,1961 ---- > > for (i = 0, j = 0; i < len; i++) > { > ! if (src[i] == '\\') > result[j++] = '\\'; > + if (src[i] == '\'') /* ANSI standard, '' */ > + result[j++] = '\''; > result[j++] = src[i]; > } > result[j] = '\0'; > Index: src/bin/pg_dump/pg_dumpall.c > =================================================================== > RCS file: /cvsroot/pgsql/src/bin/pg_dump/pg_dumpall.c,v > retrieving revision 1.59 > diff -c -c -r1.59 pg_dumpall.c > *** src/bin/pg_dump/pg_dumpall.c 18 Apr 2005 23:47:52 -0000 1.59 > --- src/bin/pg_dump/pg_dumpall.c 16 Jun 2005 01:36:57 -0000 > *************** > *** 538,544 **** > "pg_catalog.pg_get_userbyid(spcowner) AS spcowner, " > "spclocation, spcacl " > "FROM pg_catalog.pg_tablespace " > ! "WHERE spcname NOT LIKE 'pg\\_%'"); > > if (PQntuples(res) > 0) > printf("--\n-- Tablespaces\n--\n\n"); > --- 538,544 ---- > "pg_catalog.pg_get_userbyid(spcowner) AS spcowner, " > "spclocation, spcacl " > "FROM pg_catalog.pg_tablespace " > ! "WHERE spcname NOT LIKE E'pg\\_%'"); > > if (PQntuples(res) > 0) > printf("--\n-- Tablespaces\n--\n\n"); > Index: src/bin/psql/describe.c > =================================================================== > RCS file: /cvsroot/pgsql/src/bin/psql/describe.c,v > retrieving revision 1.117 > diff -c -c -r1.117 describe.c > *** src/bin/psql/describe.c 14 Jun 2005 23:59:31 -0000 1.117 > --- src/bin/psql/describe.c 16 Jun 2005 01:36:58 -0000 > *************** > *** 1766,1772 **** > appendPQExpBuffer(&buf, > "\nFROM pg_catalog.pg_namespace n LEFT JOIN pg_catalog.pg_user u\n" > " ON n.nspowner=u.usesysid\n" > ! "WHERE (n.nspname NOT LIKE 'pg\\\\_temp\\\\_%%' OR\n" > " n.nspname = (pg_catalog.current_schemas(true))[1])\n"); /* temp schema is first */ > > processNamePattern(&buf, pattern, true, false, > --- 1766,1772 ---- > appendPQExpBuffer(&buf, > "\nFROM pg_catalog.pg_namespace n LEFT JOIN pg_catalog.pg_user u\n" > " ON n.nspowner=u.usesysid\n" > ! "WHERE (n.nspname NOT LIKE E'pg\\\\_temp\\\\_%%' OR\n" > " n.nspname = (pg_catalog.current_schemas(true))[1])\n"); /* temp schema is first */ > > processNamePattern(&buf, pattern, true, false, > Index: src/include/catalog/pg_proc.h > =================================================================== > RCS file: /cvsroot/pgsql/src/include/catalog/pg_proc.h,v > retrieving revision 1.367 > diff -c -c -r1.367 pg_proc.h > *** src/include/catalog/pg_proc.h 14 Jun 2005 21:04:41 -0000 1.367 > --- src/include/catalog/pg_proc.h 16 Jun 2005 01:37:03 -0000 > *************** > *** 1461,1467 **** > DESCR("greater-than-or-equal"); > DATA(insert OID = 1157 ( timestamptz_gt PGNSP PGUID 12 f f t f i 2 16 "1184 1184" _null_ _null_ _null_ timestamp_gt- _null_ )); > DESCR("greater-than"); > ! DATA(insert OID = 1158 ( to_timestamp PGNSP PGUID 14 f f t f i 1 1184 "701" _null_ _null_ _null_ "select (\'epoch\'::timestamptz+ $1 * \'1 second\'::interval)" - _null_ )); > DESCR("convert UNIX epoch to timestamptz"); > DATA(insert OID = 1159 ( timezone PGNSP PGUID 12 f f t f i 2 1114 "25 1184" _null_ _null_ _null_ timestamptz_zone- _null_ )); > DESCR("adjust timestamp to new time zone"); > --- 1461,1467 ---- > DESCR("greater-than-or-equal"); > DATA(insert OID = 1157 ( timestamptz_gt PGNSP PGUID 12 f f t f i 2 16 "1184 1184" _null_ _null_ _null_ timestamp_gt- _null_ )); > DESCR("greater-than"); > ! DATA(insert OID = 1158 ( to_timestamp PGNSP PGUID 14 f f t f i 1 1184 "701" _null_ _null_ _null_ "select (''epoch''::timestamptz+ $1 * ''1 second''::interval)" - _null_ )); > DESCR("convert UNIX epoch to timestamptz"); > DATA(insert OID = 1159 ( timezone PGNSP PGUID 12 f f t f i 2 1114 "25 1184" _null_ _null_ _null_ timestamptz_zone- _null_ )); > DESCR("adjust timestamp to new time zone"); > *************** > *** 1541,1547 **** > > DATA(insert OID = 1215 ( obj_description PGNSP PGUID 14 f f t f s 2 25 "26 19" _null_ _null_ _null_ "selectdescription from pg_catalog.pg_description where objoid = $1 and classoid = (select oid from pg_catalog.pg_class whererelname = $2 and relnamespace = PGNSP) and objsubid = 0" - _null_ )); > DESCR("get description for object id and catalog name"); > ! DATA(insert OID = 1216 ( col_description PGNSP PGUID 14 f f t f s 2 25 "26 23" _null_ _null_ _null_ "selectdescription from pg_catalog.pg_description where objoid = $1 and classoid = \'pg_catalog.pg_class\'::regclass andobjsubid = $2" - _null_ )); > DESCR("get description for table column"); > > DATA(insert OID = 1217 ( date_trunc PGNSP PGUID 12 f f t f s 2 1184 "25 1184" _null_ _null_ _null_ timestamptz_trunc- _null_ )); > --- 1541,1547 ---- > > DATA(insert OID = 1215 ( obj_description PGNSP PGUID 14 f f t f s 2 25 "26 19" _null_ _null_ _null_ "selectdescription from pg_catalog.pg_description where objoid = $1 and classoid = (select oid from pg_catalog.pg_class whererelname = $2 and relnamespace = PGNSP) and objsubid = 0" - _null_ )); > DESCR("get description for object id and catalog name"); > ! DATA(insert OID = 1216 ( col_description PGNSP PGUID 14 f f t f s 2 25 "26 23" _null_ _null_ _null_ "selectdescription from pg_catalog.pg_description where objoid = $1 and classoid = ''pg_catalog.pg_class''::regclass andobjsubid = $2" - _null_ )); > DESCR("get description for table column"); > > DATA(insert OID = 1217 ( date_trunc PGNSP PGUID 12 f f t f s 2 1184 "25 1184" _null_ _null_ _null_ timestamptz_trunc- _null_ )); > *************** > *** 2185,2193 **** > DESCR("return portion of string"); > DATA(insert OID = 878 ( translate PGNSP PGUID 12 f f t f i 3 25 "25 25 25" _null_ _null_ _null_ translate - _null_)); > DESCR("map a set of character appearing in string"); > ! DATA(insert OID = 879 ( lpad PGNSP PGUID 14 f f t f i 2 25 "25 23" _null_ _null_ _null_ "select pg_catalog.lpad($1,$2, \' \')" - _null_ )); > DESCR("left-pad string to length"); > ! DATA(insert OID = 880 ( rpad PGNSP PGUID 14 f f t f i 2 25 "25 23" _null_ _null_ _null_ "select pg_catalog.rpad($1,$2, \' \')" - _null_ )); > DESCR("right-pad string to length"); > DATA(insert OID = 881 ( ltrim PGNSP PGUID 12 f f t f i 1 25 "25" _null_ _null_ _null_ ltrim1 - _null_ )); > DESCR("trim spaces from left end of string"); > --- 2185,2193 ---- > DESCR("return portion of string"); > DATA(insert OID = 878 ( translate PGNSP PGUID 12 f f t f i 3 25 "25 25 25" _null_ _null_ _null_ translate - _null_)); > DESCR("map a set of character appearing in string"); > ! DATA(insert OID = 879 ( lpad PGNSP PGUID 14 f f t f i 2 25 "25 23" _null_ _null_ _null_ "select pg_catalog.lpad($1,$2, '' '')" - _null_ )); > DESCR("left-pad string to length"); > ! DATA(insert OID = 880 ( rpad PGNSP PGUID 14 f f t f i 2 25 "25 23" _null_ _null_ _null_ "select pg_catalog.rpad($1,$2, '' '')" - _null_ )); > DESCR("right-pad string to length"); > DATA(insert OID = 881 ( ltrim PGNSP PGUID 12 f f t f i 1 25 "25" _null_ _null_ _null_ ltrim1 - _null_ )); > DESCR("trim spaces from left end of string"); > Index: src/test/regress/expected/arrays.out > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/expected/arrays.out,v > retrieving revision 1.25 > diff -c -c -r1.25 arrays.out > *** src/test/regress/expected/arrays.out 22 Apr 2005 21:58:32 -0000 1.25 > --- src/test/regress/expected/arrays.out 16 Jun 2005 01:37:04 -0000 > *************** > *** 436,442 **** > ERROR: malformed array literal: "{{1,{2}},{2,3}}" > select '{{},{}}'::text[]; > ERROR: malformed array literal: "{{},{}}" > ! select '{{1,2},\\{2,3}}'::text[]; > ERROR: malformed array literal: "{{1,2},\{2,3}}" > select '{{"1 2" x},{3}}'::text[]; > ERROR: malformed array literal: "{{"1 2" x},{3}}" > --- 436,442 ---- > ERROR: malformed array literal: "{{1,{2}},{2,3}}" > select '{{},{}}'::text[]; > ERROR: malformed array literal: "{{},{}}" > ! select E'{{1,2},\\{2,3}}'::text[]; > ERROR: malformed array literal: "{{1,2},\{2,3}}" > select '{{"1 2" x},{3}}'::text[]; > ERROR: malformed array literal: "{{"1 2" x},{3}}" > Index: src/test/regress/expected/copy2.out > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/expected/copy2.out,v > retrieving revision 1.21 > diff -c -c -r1.21 copy2.out > *** src/test/regress/expected/copy2.out 13 May 2005 06:33:40 -0000 1.21 > --- src/test/regress/expected/copy2.out 16 Jun 2005 01:37:04 -0000 > *************** > *** 49,55 **** > -- various COPY options: delimiters, oids, NULL string > COPY x (b, c, d, e) from stdin with oids delimiter ',' null 'x'; > COPY x from stdin WITH DELIMITER AS ';' NULL AS ''; > ! COPY x from stdin WITH DELIMITER AS ':' NULL AS '\\X'; > -- check results of copy in > SELECT * FROM x; > a | b | c | d | e > --- 49,55 ---- > -- various COPY options: delimiters, oids, NULL string > COPY x (b, c, d, e) from stdin with oids delimiter ',' null 'x'; > COPY x from stdin WITH DELIMITER AS ';' NULL AS ''; > ! COPY x from stdin WITH DELIMITER AS ':' NULL AS E'\\X'; > -- check results of copy in > SELECT * FROM x; > a | b | c | d | e > *************** > *** 176,183 **** > col1 text, > col2 text > ); > ! INSERT INTO y VALUES ('Jackson, Sam', '\\h'); > ! INSERT INTO y VALUES ('It is "perfect".','\t'); > INSERT INTO y VALUES ('', NULL); > COPY y TO stdout WITH CSV; > "Jackson, Sam",\h > --- 176,183 ---- > col1 text, > col2 text > ); > ! INSERT INTO y VALUES ('Jackson, Sam', E'\\h'); > ! INSERT INTO y VALUES ('It is "perfect".',E'\t'); > INSERT INTO y VALUES ('', NULL); > COPY y TO stdout WITH CSV; > "Jackson, Sam",\h > *************** > *** 187,193 **** > Jackson, Sam|\h > It is "perfect".| > ''| > ! COPY y TO stdout WITH CSV FORCE QUOTE col2 ESCAPE '\\'; > "Jackson, Sam","\\h" > "It is \"perfect\"."," " > "", > --- 187,193 ---- > Jackson, Sam|\h > It is "perfect".| > ''| > ! COPY y TO stdout WITH CSV FORCE QUOTE col2 ESCAPE E'\\'; > "Jackson, Sam","\\h" > "It is \"perfect\"."," " > "", > Index: src/test/regress/expected/int8.out > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/expected/int8.out,v > retrieving revision 1.9 > diff -c -c -r1.9 int8.out > *** src/test/regress/expected/int8.out 4 Oct 2004 14:42:47 -0000 1.9 > --- src/test/regress/expected/int8.out 16 Jun 2005 01:37:04 -0000 > *************** > *** 280,286 **** > | -4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 . 0 0 0 > (5 rows) > > ! SELECT '' AS to_char_16, to_char(q2, '99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM INT8_TBL; > to_char_16 | to_char > ------------+----------------------------------------------------------- > | text 9999 "text between quote marks" 456 > --- 280,286 ---- > | -4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 . 0 0 0 > (5 rows) > > ! SELECT '' AS to_char_16, to_char(q2, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM INT8_TBL; > to_char_16 | to_char > ------------+----------------------------------------------------------- > | text 9999 "text between quote marks" 456 > Index: src/test/regress/expected/numeric.out > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/expected/numeric.out,v > retrieving revision 1.16 > diff -c -c -r1.16 numeric.out > *** src/test/regress/expected/numeric.out 28 Oct 2004 18:55:07 -0000 1.16 > --- src/test/regress/expected/numeric.out 16 Jun 2005 01:37:05 -0000 > *************** > *** 1072,1078 **** > | -2 4 9 2 6 8 0 4 . 0 4 5 0 4 7 4 2 > (10 rows) > > ! SELECT '' AS to_char_20, to_char(val, '99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM num_data; > to_char_20 | to_char > ------------+----------------------------------------------------------- > | text 9999 "text between quote marks" 0 > --- 1072,1078 ---- > | -2 4 9 2 6 8 0 4 . 0 4 5 0 4 7 4 2 > (10 rows) > > ! SELECT '' AS to_char_20, to_char(val, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM num_data; > to_char_20 | to_char > ------------+----------------------------------------------------------- > | text 9999 "text between quote marks" 0 > Index: src/test/regress/expected/rowtypes.out > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/expected/rowtypes.out,v > retrieving revision 1.2 > diff -c -c -r1.2 rowtypes.out > *** src/test/regress/expected/rowtypes.out 9 Jun 2004 19:08:20 -0000 1.2 > --- src/test/regress/expected/rowtypes.out 16 Jun 2005 01:37:05 -0000 > *************** > *** 25,31 **** > (Joe,"von Blow") | (Joe,d'Blow) > (1 row) > > ! select '(Joe,"von""Blow")'::fullname, '(Joe,d\\\\Blow)'::fullname; > fullname | fullname > -------------------+----------------- > (Joe,"von""Blow") | (Joe,"d\\Blow") > --- 25,31 ---- > (Joe,"von Blow") | (Joe,d'Blow) > (1 row) > > ! select '(Joe,"von""Blow")'::fullname, E'(Joe,d\\\\Blow)'::fullname; > fullname | fullname > -------------------+----------------- > (Joe,"von""Blow") | (Joe,"d\\Blow") > Index: src/test/regress/expected/timestamp.out > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/expected/timestamp.out,v > retrieving revision 1.27 > diff -c -c -r1.27 timestamp.out > *** src/test/regress/expected/timestamp.out 3 Jun 2004 02:08:06 -0000 1.27 > --- src/test/regress/expected/timestamp.out 16 Jun 2005 01:37:06 -0000 > *************** > *** 1044,1050 **** > | 05 05 17 32 01 63121 > (64 rows) > > ! SELECT '' AS to_char_6, to_char(d1, '"HH:MI:SS is" HH:MI:SS "\\"text between quote marks\\""') > FROM TIMESTAMP_TBL; > to_char_6 | to_char > -----------+------------------------------------------------- > --- 1044,1050 ---- > | 05 05 17 32 01 63121 > (64 rows) > > ! SELECT '' AS to_char_6, to_char(d1, E'"HH:MI:SS is" HH:MI:SS "\\"text between quote marks\\""') > FROM TIMESTAMP_TBL; > to_char_6 | to_char > -----------+------------------------------------------------- > *************** > *** 1358,1364 **** > (1 row) > > SELECT '' AS to_timestamp_6, to_timestamp('15 "text between quote marks" 98 54 45', > ! 'HH "\\text between quote marks\\"" YY MI SS'); > to_timestamp_6 | to_timestamp > ----------------+------------------------------ > | Thu Jan 01 15:54:45 1998 PST > --- 1358,1364 ---- > (1 row) > > SELECT '' AS to_timestamp_6, to_timestamp('15 "text between quote marks" 98 54 45', > ! E'HH "\\text between quote marks\\"" YY MI SS'); > to_timestamp_6 | to_timestamp > ----------------+------------------------------ > | Thu Jan 01 15:54:45 1998 PST > Index: src/test/regress/expected/timestamptz.out > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/expected/timestamptz.out,v > retrieving revision 1.17 > diff -c -c -r1.17 timestamptz.out > *** src/test/regress/expected/timestamptz.out 11 Jul 2004 04:57:20 -0000 1.17 > --- src/test/regress/expected/timestamptz.out 16 Jun 2005 01:37:07 -0000 > *************** > *** 1041,1047 **** > | 05 05 17 32 01 63121 > (64 rows) > > ! SELECT '' AS to_char_6, to_char(d1, '"HH:MI:SS is" HH:MI:SS "\\"text between quote marks\\""') > FROM TIMESTAMPTZ_TBL; > to_char_6 | to_char > -----------+------------------------------------------------- > --- 1041,1047 ---- > | 05 05 17 32 01 63121 > (64 rows) > > ! SELECT '' AS to_char_6, to_char(d1, E'"HH:MI:SS is" HH:MI:SS "\\"text between quote marks\\""') > FROM TIMESTAMPTZ_TBL; > to_char_6 | to_char > -----------+------------------------------------------------- > *************** > *** 1427,1433 **** > (1 row) > > SELECT '' AS to_timestamp_6, to_timestamp('15 "text between quote marks" 98 54 45', > ! 'HH "\\text between quote marks\\"" YY MI SS'); > to_timestamp_6 | to_timestamp > ----------------+------------------------------ > | Thu Jan 01 15:54:45 1998 PST > --- 1427,1433 ---- > (1 row) > > SELECT '' AS to_timestamp_6, to_timestamp('15 "text between quote marks" 98 54 45', > ! E'HH "\\text between quote marks\\"" YY MI SS'); > to_timestamp_6 | to_timestamp > ----------------+------------------------------ > | Thu Jan 01 15:54:45 1998 PST > Index: src/test/regress/expected/type_sanity.out > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/expected/type_sanity.out,v > retrieving revision 1.25 > diff -c -c -r1.25 type_sanity.out > *** src/test/regress/expected/type_sanity.out 30 Apr 2005 20:31:39 -0000 1.25 > --- src/test/regress/expected/type_sanity.out 16 Jun 2005 01:37:07 -0000 > *************** > *** 59,65 **** > -- NOTE: as of 8.0, this check finds smgr and unknown. > SELECT p1.oid, p1.typname > FROM pg_type as p1 > ! WHERE p1.typtype in ('b') AND p1.typname NOT LIKE '\\_%' AND NOT EXISTS > (SELECT 1 FROM pg_type as p2 > WHERE p2.typname = ('_' || p1.typname)::name AND > p2.typelem = p1.oid); > --- 59,65 ---- > -- NOTE: as of 8.0, this check finds smgr and unknown. > SELECT p1.oid, p1.typname > FROM pg_type as p1 > ! WHERE p1.typtype in ('b') AND p1.typname NOT LIKE E'\\_%' AND NOT EXISTS > (SELECT 1 FROM pg_type as p2 > WHERE p2.typname = ('_' || p1.typname)::name AND > p2.typelem = p1.oid); > Index: src/test/regress/input/copy.source > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/input/copy.source,v > retrieving revision 1.12 > diff -c -c -r1.12 copy.source > *** src/test/regress/input/copy.source 10 May 2005 00:16:07 -0000 1.12 > --- src/test/regress/input/copy.source 16 Jun 2005 01:37:07 -0000 > *************** > *** 62,71 **** > test text, > filler int); > > ! insert into copytest values('DOS','abc\r\ndef',1); > ! insert into copytest values('Unix','abc\ndef',2); > ! insert into copytest values('Mac','abc\rdef',3); > ! insert into copytest values('esc\\ape','a\\r\\\r\\\n\\nb',4); > > copy copytest to '@abs_builddir@/results/copytest.csv' csv; > > --- 62,71 ---- > test text, > filler int); > > ! insert into copytest values('DOS',E'abc\r\ndef',1); > ! insert into copytest values('Unix',E'abc\ndef',2); > ! insert into copytest values('Mac',E'abc\rdef',3); > ! insert into copytest values(E'esc\\ape',E'a\\r\\\r\\\n\\nb',4); > > copy copytest to '@abs_builddir@/results/copytest.csv' csv; > > *************** > *** 79,87 **** > > --- same test but with an escape char different from quote char > > ! copy copytest to '@abs_builddir@/results/copytest.csv' csv quote '\'' escape '\\'; > > ! copy copytest2 from '@abs_builddir@/results/copytest.csv' csv quote '\'' escape '\\'; > > select * from copytest except select * from copytest2; > > --- 79,87 ---- > > --- same test but with an escape char different from quote char > > ! copy copytest to '@abs_builddir@/results/copytest.csv' csv quote '''' escape E'\\'; > > ! copy copytest2 from '@abs_builddir@/results/copytest.csv' csv quote '''' escape E'\\'; > > select * from copytest except select * from copytest2; > > Index: src/test/regress/output/copy.source > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/output/copy.source,v > retrieving revision 1.10 > diff -c -c -r1.10 copy.source > *** src/test/regress/output/copy.source 10 May 2005 00:16:07 -0000 1.10 > --- src/test/regress/output/copy.source 16 Jun 2005 01:37:08 -0000 > *************** > *** 37,46 **** > style text, > test text, > filler int); > ! insert into copytest values('DOS','abc\r\ndef',1); > ! insert into copytest values('Unix','abc\ndef',2); > ! insert into copytest values('Mac','abc\rdef',3); > ! insert into copytest values('esc\\ape','a\\r\\\r\\\n\\nb',4); > copy copytest to '@abs_builddir@/results/copytest.csv' csv; > create temp table copytest2 (like copytest); > copy copytest2 from '@abs_builddir@/results/copytest.csv' csv; > --- 37,46 ---- > style text, > test text, > filler int); > ! insert into copytest values('DOS',E'abc\r\ndef',1); > ! insert into copytest values('Unix',E'abc\ndef',2); > ! insert into copytest values('Mac',E'abc\rdef',3); > ! insert into copytest values(E'esc\\ape',E'a\\r\\\r\\\n\\nb',4); > copy copytest to '@abs_builddir@/results/copytest.csv' csv; > create temp table copytest2 (like copytest); > copy copytest2 from '@abs_builddir@/results/copytest.csv' csv; > *************** > *** 51,58 **** > > truncate copytest2; > --- same test but with an escape char different from quote char > ! copy copytest to '@abs_builddir@/results/copytest.csv' csv quote '\'' escape '\\'; > ! copy copytest2 from '@abs_builddir@/results/copytest.csv' csv quote '\'' escape '\\'; > select * from copytest except select * from copytest2; > style | test | filler > -------+------+-------- > --- 51,58 ---- > > truncate copytest2; > --- same test but with an escape char different from quote char > ! copy copytest to '@abs_builddir@/results/copytest.csv' csv quote '''' escape E'\\'; > ! copy copytest2 from '@abs_builddir@/results/copytest.csv' csv quote '''' escape E'\\'; > select * from copytest except select * from copytest2; > style | test | filler > -------+------+-------- > Index: src/test/regress/sql/arrays.sql > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/sql/arrays.sql,v > retrieving revision 1.20 > diff -c -c -r1.20 arrays.sql > *** src/test/regress/sql/arrays.sql 22 Apr 2005 21:58:32 -0000 1.20 > --- src/test/regress/sql/arrays.sql 16 Jun 2005 01:37:08 -0000 > *************** > *** 204,210 **** > -- none of the following should be accepted > select '{{1,{2}},{2,3}}'::text[]; > select '{{},{}}'::text[]; > ! select '{{1,2},\\{2,3}}'::text[]; > select '{{"1 2" x},{3}}'::text[]; > select '{}}'::text[]; > select '{ }}'::text[]; > --- 204,210 ---- > -- none of the following should be accepted > select '{{1,{2}},{2,3}}'::text[]; > select '{{},{}}'::text[]; > ! select E'{{1,2},\\{2,3}}'::text[]; > select '{{"1 2" x},{3}}'::text[]; > select '{}}'::text[]; > select '{ }}'::text[]; > Index: src/test/regress/sql/copy2.sql > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/sql/copy2.sql,v > retrieving revision 1.12 > diff -c -c -r1.12 copy2.sql > *** src/test/regress/sql/copy2.sql 13 May 2005 06:33:40 -0000 1.12 > --- src/test/regress/sql/copy2.sql 16 Jun 2005 01:37:08 -0000 > *************** > *** 83,89 **** > 3000;;c;; > \. > > ! COPY x from stdin WITH DELIMITER AS ':' NULL AS '\\X'; > 4000:\X:C:\X:\X > 4001:1:empty:: > 4002:2:null:\X:\X > --- 83,89 ---- > 3000;;c;; > \. > > ! COPY x from stdin WITH DELIMITER AS ':' NULL AS E'\\X'; > 4000:\X:C:\X:\X > 4001:1:empty:: > 4002:2:null:\X:\X > *************** > *** 121,133 **** > col2 text > ); > > ! INSERT INTO y VALUES ('Jackson, Sam', '\\h'); > ! INSERT INTO y VALUES ('It is "perfect".','\t'); > INSERT INTO y VALUES ('', NULL); > > COPY y TO stdout WITH CSV; > COPY y TO stdout WITH CSV QUOTE '''' DELIMITER '|'; > ! COPY y TO stdout WITH CSV FORCE QUOTE col2 ESCAPE '\\'; > > --test that we read consecutive LFs properly > > --- 121,133 ---- > col2 text > ); > > ! INSERT INTO y VALUES ('Jackson, Sam', E'\\h'); > ! INSERT INTO y VALUES ('It is "perfect".',E'\t'); > INSERT INTO y VALUES ('', NULL); > > COPY y TO stdout WITH CSV; > COPY y TO stdout WITH CSV QUOTE '''' DELIMITER '|'; > ! COPY y TO stdout WITH CSV FORCE QUOTE col2 ESCAPE E'\\'; > > --test that we read consecutive LFs properly > > Index: src/test/regress/sql/int8.sql > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/sql/int8.sql,v > retrieving revision 1.7 > diff -c -c -r1.7 int8.sql > *** src/test/regress/sql/int8.sql 4 Oct 2004 14:42:48 -0000 1.7 > --- src/test/regress/sql/int8.sql 16 Jun 2005 01:37:08 -0000 > *************** > *** 61,65 **** > SELECT '' AS to_char_13, to_char(q2, 'L9999999999999999.000') FROM INT8_TBL; > SELECT '' AS to_char_14, to_char(q2, 'FM9999999999999999.999') FROM INT8_TBL; > SELECT '' AS to_char_15, to_char(q2, 'S 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9') FROM INT8_TBL; > ! SELECT '' AS to_char_16, to_char(q2, '99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM INT8_TBL; > SELECT '' AS to_char_17, to_char(q2, '999999SG9999999999') FROM INT8_TBL; > --- 61,65 ---- > SELECT '' AS to_char_13, to_char(q2, 'L9999999999999999.000') FROM INT8_TBL; > SELECT '' AS to_char_14, to_char(q2, 'FM9999999999999999.999') FROM INT8_TBL; > SELECT '' AS to_char_15, to_char(q2, 'S 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9') FROM INT8_TBL; > ! SELECT '' AS to_char_16, to_char(q2, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM INT8_TBL; > SELECT '' AS to_char_17, to_char(q2, '999999SG9999999999') FROM INT8_TBL; > Index: src/test/regress/sql/numeric.sql > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/sql/numeric.sql,v > retrieving revision 1.11 > diff -c -c -r1.11 numeric.sql > *** src/test/regress/sql/numeric.sql 28 Oct 2004 18:55:08 -0000 1.11 > --- src/test/regress/sql/numeric.sql 16 Jun 2005 01:37:08 -0000 > *************** > *** 742,748 **** > SELECT '' AS to_char_17, to_char(val, 'FM9999999999999999.99999999999999') FROM num_data; > SELECT '' AS to_char_18, to_char(val, 'S 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9') FROM num_data; > SELECT '' AS to_char_19, to_char(val, 'FMS 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9') FROMnum_data; > ! SELECT '' AS to_char_20, to_char(val, '99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM num_data; > SELECT '' AS to_char_21, to_char(val, '999999SG9999999999') FROM num_data; > SELECT '' AS to_char_22, to_char(val, 'FM9999999999999999.999999999999999') FROM num_data; > > --- 742,748 ---- > SELECT '' AS to_char_17, to_char(val, 'FM9999999999999999.99999999999999') FROM num_data; > SELECT '' AS to_char_18, to_char(val, 'S 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9') FROM num_data; > SELECT '' AS to_char_19, to_char(val, 'FMS 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9') FROMnum_data; > ! SELECT '' AS to_char_20, to_char(val, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM num_data; > SELECT '' AS to_char_21, to_char(val, '999999SG9999999999') FROM num_data; > SELECT '' AS to_char_22, to_char(val, 'FM9999999999999999.999999999999999') FROM num_data; > > Index: src/test/regress/sql/rowtypes.sql > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/sql/rowtypes.sql,v > retrieving revision 1.2 > diff -c -c -r1.2 rowtypes.sql > *** src/test/regress/sql/rowtypes.sql 9 Jun 2004 19:08:20 -0000 1.2 > --- src/test/regress/sql/rowtypes.sql 16 Jun 2005 01:37:08 -0000 > *************** > *** 20,26 **** > > select '(Joe,von Blow)'::fullname, '(Joe,d''Blow)'::fullname; > > ! select '(Joe,"von""Blow")'::fullname, '(Joe,d\\\\Blow)'::fullname; > > select '(Joe,"Blow,Jr")'::fullname; > > --- 20,26 ---- > > select '(Joe,von Blow)'::fullname, '(Joe,d''Blow)'::fullname; > > ! select '(Joe,"von""Blow")'::fullname, E'(Joe,d\\\\Blow)'::fullname; > > select '(Joe,"Blow,Jr")'::fullname; > > Index: src/test/regress/sql/timestamp.sql > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/sql/timestamp.sql,v > retrieving revision 1.13 > diff -c -c -r1.13 timestamp.sql > *** src/test/regress/sql/timestamp.sql 5 Mar 2004 02:41:14 -0000 1.13 > --- src/test/regress/sql/timestamp.sql 16 Jun 2005 01:37:09 -0000 > *************** > *** 186,192 **** > SELECT '' AS to_char_5, to_char(d1, 'HH HH12 HH24 MI SS SSSS') > FROM TIMESTAMP_TBL; > > ! SELECT '' AS to_char_6, to_char(d1, '"HH:MI:SS is" HH:MI:SS "\\"text between quote marks\\""') > FROM TIMESTAMP_TBL; > > SELECT '' AS to_char_7, to_char(d1, 'HH24--text--MI--text--SS') > --- 186,192 ---- > SELECT '' AS to_char_5, to_char(d1, 'HH HH12 HH24 MI SS SSSS') > FROM TIMESTAMP_TBL; > > ! SELECT '' AS to_char_6, to_char(d1, E'"HH:MI:SS is" HH:MI:SS "\\"text between quote marks\\""') > FROM TIMESTAMP_TBL; > > SELECT '' AS to_char_7, to_char(d1, 'HH24--text--MI--text--SS') > *************** > *** 211,217 **** > SELECT '' AS to_timestamp_5, to_timestamp('1,582nd VIII 21', 'Y,YYYth FMRM DD'); > > SELECT '' AS to_timestamp_6, to_timestamp('15 "text between quote marks" 98 54 45', > ! 'HH "\\text between quote marks\\"" YY MI SS'); > > SELECT '' AS to_timestamp_7, to_timestamp('05121445482000', 'MMDDHHMISSYYYY'); > > --- 211,217 ---- > SELECT '' AS to_timestamp_5, to_timestamp('1,582nd VIII 21', 'Y,YYYth FMRM DD'); > > SELECT '' AS to_timestamp_6, to_timestamp('15 "text between quote marks" 98 54 45', > ! E'HH "\\text between quote marks\\"" YY MI SS'); > > SELECT '' AS to_timestamp_7, to_timestamp('05121445482000', 'MMDDHHMISSYYYY'); > > Index: src/test/regress/sql/timestamptz.sql > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/sql/timestamptz.sql,v > retrieving revision 1.6 > diff -c -c -r1.6 timestamptz.sql > *** src/test/regress/sql/timestamptz.sql 5 Mar 2004 02:41:14 -0000 1.6 > --- src/test/regress/sql/timestamptz.sql 16 Jun 2005 01:37:09 -0000 > *************** > *** 179,185 **** > SELECT '' AS to_char_5, to_char(d1, 'HH HH12 HH24 MI SS SSSS') > FROM TIMESTAMPTZ_TBL; > > ! SELECT '' AS to_char_6, to_char(d1, '"HH:MI:SS is" HH:MI:SS "\\"text between quote marks\\""') > FROM TIMESTAMPTZ_TBL; > > SELECT '' AS to_char_7, to_char(d1, 'HH24--text--MI--text--SS') > --- 179,185 ---- > SELECT '' AS to_char_5, to_char(d1, 'HH HH12 HH24 MI SS SSSS') > FROM TIMESTAMPTZ_TBL; > > ! SELECT '' AS to_char_6, to_char(d1, E'"HH:MI:SS is" HH:MI:SS "\\"text between quote marks\\""') > FROM TIMESTAMPTZ_TBL; > > SELECT '' AS to_char_7, to_char(d1, 'HH24--text--MI--text--SS') > *************** > *** 207,213 **** > SELECT '' AS to_timestamp_5, to_timestamp('1,582nd VIII 21', 'Y,YYYth FMRM DD'); > > SELECT '' AS to_timestamp_6, to_timestamp('15 "text between quote marks" 98 54 45', > ! 'HH "\\text between quote marks\\"" YY MI SS'); > > SELECT '' AS to_timestamp_7, to_timestamp('05121445482000', 'MMDDHHMISSYYYY'); > > --- 207,213 ---- > SELECT '' AS to_timestamp_5, to_timestamp('1,582nd VIII 21', 'Y,YYYth FMRM DD'); > > SELECT '' AS to_timestamp_6, to_timestamp('15 "text between quote marks" 98 54 45', > ! E'HH "\\text between quote marks\\"" YY MI SS'); > > SELECT '' AS to_timestamp_7, to_timestamp('05121445482000', 'MMDDHHMISSYYYY'); > > Index: src/test/regress/sql/type_sanity.sql > =================================================================== > RCS file: /cvsroot/pgsql/src/test/regress/sql/type_sanity.sql,v > retrieving revision 1.25 > diff -c -c -r1.25 type_sanity.sql > *** src/test/regress/sql/type_sanity.sql 30 Apr 2005 20:31:39 -0000 1.25 > --- src/test/regress/sql/type_sanity.sql 16 Jun 2005 01:37:09 -0000 > *************** > *** 54,60 **** > > SELECT p1.oid, p1.typname > FROM pg_type as p1 > ! WHERE p1.typtype in ('b') AND p1.typname NOT LIKE '\\_%' AND NOT EXISTS > (SELECT 1 FROM pg_type as p2 > WHERE p2.typname = ('_' || p1.typname)::name AND > p2.typelem = p1.oid); > --- 54,60 ---- > > SELECT p1.oid, p1.typname > FROM pg_type as p1 > ! WHERE p1.typtype in ('b') AND p1.typname NOT LIKE E'\\_%' AND NOT EXISTS > (SELECT 1 FROM pg_type as p2 > WHERE p2.typname = ('_' || p1.typname)::name AND > p2.typelem = p1.oid); > > > ------------------------------------------------------------------------ > > > ---------------------------(end of broadcast)--------------------------- > TIP 7: don't forget to increase your free space map settings
pgsql-patches by date: