On 22 Aug 2010, at 20:09, SourceForge.net wrote:

> Bug Tracker item #3023888, was opened at 2010-07-01 18:19
> Message generated for change (Comment added) made by sbajic
> You can respond by visiting: 
> https://sourceforge.net/tracker/?func=detail&atid=1126467&aid=3023888&group_id=250683
> 
> Please note that this message will contain a full copy of the comment thread,
> including the initial issue submission, for this request,
> not just the latest update.
> Category: daemon
> Group: v3.9.0
>> Status: Pending
> Resolution: None
> Priority: 5
> Private: No
> Submitted By: Stéphane Berthelot (sberthelot)
> Assigned to: Stevan Bajic (sbajic)
> Summary: Wrong escaping of bytea (signature data) with postgresql 8.4
> 
> Initial Comment:
> Escaping of insertion has been modified in 3.9.0 in two ways :
> - using PQescapeByteaConn (instead of PQescapeBytea)
> - adding E'' syntax in INSERT
> 
> But this encodes twice the data and then doesn't work on fresh PostgreSQL 
> 8.4.2 with or without standard_conforming_string in either UTF8 or SQL_ASCII 
> database encoding.
> 
> Removing the E'' syntax (since the string is already correctly encoded now) 
> makes signature insertion work again
> 
> In the git code, it may be necessary to add the if construct in this patch to 
> check about postgresql version (but <=7.4 seem not supported anymore 
> officially by the postgres team now ...)

(...)

> ----------------------------------------------------------------------
> 
> Comment By: Stevan Bajic (sbajic)
> Date: 2010-08-05 21:08
> 
> Message:
>> The "correct" way to fix is certainly to replace queries containing
> bytea
>> (that use string copy functions) by stored procedures instead. What do
>> you think about it ?
>> 
> Hmm... so you would take a stream of data and transform it with a
> procedure on the server to fit into a normal string? Something like the
> current commands in 3.9.1 of DSPAM are doing it? That could work if you
> query inside DSPAM data from PostgreSQL but how do you want to transmit the
> other way around? I mean you have a stream of binary data and you want to
> push it to PostgreSQL. How can you assure that the procedure will see the
> data the way it should see it? And why do you think that a own crafted
> procedure should be better/faster than using
> PQescapeByteaConn/PQescapeBytea?
> 
> 
>> If ok I'll try to prepare a patch in this direction and
>> test it.
>> 
> Please take the time and test DSPAM Git and tell me if it is working there
> or not?

(...)

> ----------------------------------------------------------------------
> 
> Comment By: Stéphane Berthelot (sberthelot)
> Date: 2010-08-05 12:00
> 
> Message:
> I know it's certainly not the failsafe way to fix the bug ...
> I was referring to
> http://www.postgresql.org/docs/8.4/static/datatype-binary.html (between
> table 8-7 and table 8-8)
> The pgsql doc says that the bytea are to be encoded twice since they are
> decoded first by the query analyzer then by the bytea processor.
> 
> Removing the E'' syntax was the quickiest way for me to "fix it" (since
> with stock dspam 3.9.0 and stock postgresql 8.4 the signature data doesn't
> get inserted and return an encoding error)
> 
> I agree with you on the syntax but it doesn't explain why it doesn't work
> with E'' and start working when I remove it ...
> 
> The "correct" way to fix is certainly to replace queries containing bytea
> (that use string copy functions) by stored procedures instead. What do you
> think about it ? If ok I'll try to prepare a patch in this direction and
> test it.

This is almost certainly due to the user having changed the PostgreSQL setting 
'standard_conforming_strings' to 'on'. Admittedly that would be the preferable 
way to interpret strings, but it's not the default (compatibility reasons 
mostly).

dspam=> SHOW standard_conforming_strings ;
 standard_conforming_strings 
-----------------------------
 off
(1 row)


> ----------------------------------------------------------------------
> 
> Comment By: Stevan Bajic (sbajic)
> Date: 2010-08-04 23:38
> 
> Message:
>> But this encodes twice the data
>> 
> This is simply not true. The 'E' syntax is telling PostgreSQL that the
> data is not a string literal but a escaped string. That's all.
> 
> ----------------------------------------------------------------------


That's not true either. The E'' syntax is to denote non-standard-conforming 
strings, meaning they don't conform to the SQL standard and contain backslash 
escapes (like \' instead of '').

I don't think signature data is in fact meaningful text, is it? If I understand 
correctly it's actually a binary string, in which case bytea would indeed be 
the more appropriate data-format to use.

And Stevan is correct that you don't need any stored procedures for that. Bytea 
is supported in versions <= 7.4 too, for those who still use that.

Alban Hertroys

--
If you can't see the forest for the trees,
cut the trees and you'll see there is no forest.


!DSPAM:1155,4c72105610404812612189!



------------------------------------------------------------------------------
This SF.net email is sponsored by 

Make an app they can't live without
Enter the BlackBerry Developer Challenge
http://p.sf.net/sfu/RIM-dev2dev 
_______________________________________________
Dspam-devel mailing list
Dspam-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dspam-devel

Reply via email to