Re: Escape handling in strings

From: Christopher Kings-Lynne <chriskl(at)familyhealth(dot)com(dot)au>
To: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
Cc: PostgreSQL-patches <pgsql-patches(at)postgresql(dot)org>
Subject: Re: Escape handling in strings
Date: 2005-06-16 02:41:35
Message-ID: 42B0E6DF.2010209@familyhealth.com.au
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers 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(at)efd(dot)r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.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(at)stack(dot)net qwe-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.2 readline-4.2. 234
> <i <b> wow < jqw <> qwerty');
> tokid | token
> --- 382,388 ----
> 23 | entity | HTML Entity
> (23 rows)
>
> ! select * from parse('default', '345 qwe(at)efd(dot)r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.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(at)stack(dot)net qwe-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.2 readline-4.2. 234
> <i <b> wow < jqw <> qwerty');
> tokid | token
> ***************
> *** 529,535 ****
> 1 | qwerty
> (138 rows)
>
> ! SELECT to_tsvector('default', '345 qwe(at)efd(dot)r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.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(at)stack(dot)net qwe-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.2 readline-4.2. 234
> <i <b> wow < jqw <> qwerty');
> to_tsvector
> --- 529,535 ----
> 1 | qwerty
> (138 rows)
>
> ! SELECT to_tsvector('default', '345 qwe(at)efd(dot)r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.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(at)stack(dot)net qwe-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.2 readline-4.2. 234
> <i <b> wow < jqw <> qwerty');
> to_tsvector
> ***************
> *** 543,549 ****
> 2
> (1 row)
>
> ! SELECT length(to_tsvector('default', '345 qwe(at)efd(dot)r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.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(at)stack(dot)net qwe-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.2 readline-4.2. 234
> <i <b> wow < jqw <> qwerty'));
> length
> --- 543,549 ----
> 2
> (1 row)
>
> ! SELECT length(to_tsvector('default', '345 qwe(at)efd(dot)r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.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(at)stack(dot)net qwe-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.2 readline-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(at)efd(dot)r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.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(at)stack(dot)net qwe-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.2 readline-4.2. 234
> <i <b> wow < jqw <> qwerty');
>
> ! SELECT to_tsvector('default', '345 qwe(at)efd(dot)r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.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(at)stack(dot)net qwe-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.2 readline-4.2. 234
> <i <b> wow < jqw <> qwerty');
>
> SELECT length(to_tsvector('default', '345 qw'));
>
> ! SELECT length(to_tsvector('default', '345 qwe(at)efd(dot)r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.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(at)stack(dot)net qwe-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.2 readline-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(at)efd(dot)r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.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(at)stack(dot)net qwe-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.2 readline-4.2. 234
> <i <b> wow < jqw <> qwerty');
>
> ! SELECT to_tsvector('default', '345 qwe(at)efd(dot)r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.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(at)stack(dot)net qwe-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.2 readline-4.2. 234
> <i <b> wow < jqw <> qwerty');
>
> SELECT length(to_tsvector('default', '345 qw'));
>
> ! SELECT length(to_tsvector('default', '345 qwe(at)efd(dot)r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.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(at)stack(dot)net qwe-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.2 readline-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_ "select description from pg_catalog.pg_description where objoid = $1 and classoid = (select oid from pg_catalog.pg_class where relname = $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_ "select description from pg_catalog.pg_description where objoid = $1 and classoid = \'pg_catalog.pg_class\'::regclass and objsubid = $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_ "select description from pg_catalog.pg_description where objoid = $1 and classoid = (select oid from pg_catalog.pg_class where relname = $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_ "select description from pg_catalog.pg_description where objoid = $1 and classoid = ''pg_catalog.pg_class''::regclass and objsubid = $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') FROM num_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') FROM num_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

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Bruce Momjian 2005-06-16 02:54:20 Re: Escape handling in strings
Previous Message Bruce Momjian 2005-06-16 02:35:02 Two-phase commit

Browse pgsql-patches by date

  From Date Subject
Next Message Bruce Momjian 2005-06-16 02:54:20 Re: Escape handling in strings
Previous Message Bruce Momjian 2005-06-16 02:29:31 Escape handling in strings