Re: converting E'C:\\something' to bytea

From: Vlad Romascanu <vromascanu(at)accurev(dot)com>
To: Bruce Momjian <bruce(at)momjian(dot)us>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: converting E'C:\\something' to bytea
Date: 2011-03-16 16:09:08
Message-ID: AANLkTi=qB0CQBboJ9=ZR6VWNMRcENy_skK_L7PvQySSi@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hi, Bruce,

Yes, I essentially want to reinterpret text as bytea without any
conversion or actual backslash logic coming in the process, in the
same way pg_convert_from internally reinterprets the bytea return
value from pg_convert as text without any additional logic. I.e.
given the text field 'C:\some\dir' (E'C:\\some\\dir') which is 11
codepoints long and contains a grand total of two backslashes, I want
those two backslashes to map to two byte values 0x5c in a
corresponding 11-byte long bytea. :)

I tried to achieve this zero-logic via CREATE DOMAIN ... WITHOUT
FUNCTION and casting via the domain, assuming the lot would then
behave like the aforementioned trick in the pg_convert_from
implementation, but it doesn't seem to work that way. :(

V.

On Wed, Mar 16, 2011 at 11:51 AM, Bruce Momjian <bruce(at)momjian(dot)us> wrote:
> Vlad Romascanu wrote:
>> Hello,
>>
>> Is there any way of casting (reinterpreting) a varchar/text field
>> containing arbitrary backslashes to bytea without making an escaped
>> copy of the varchar/text first?  In the examples below I am using a
>> constant E'...' for clarity, the value normally comes from a
>> varchar/text column in a table but the end behaviour is the same.
>>
>> E.g.:
>>
>> 1) SELECT E'C:\\something'::bytea
>>     ERROR:  invalid input syntax for type bytea
>>     --> essentially like calling decode(); bad in this case because of
>> the naked backslash!
>>
>> 2) SELECT replace(E'C:\\something', E'\\', E'\\\\')::bytea
>>     --> works OK, but bad performance-wise because needed to make an
>> escaped copy of the string which is inefficient
>>
>> 3) CREATE DOMAIN my_varlena AS text;
>>     CREATE CAST (my_varlena AS bytea) WITHOUT FUNCTION;
>>     SELECT E'C:\\something'::my_varlena::bytea
>>     ERROR:  invalid input syntax for type bytea
>>     --> WHY?
>
> Well, the '\\' is being converted to '\' because of the single-quotes,
> and then bytea is saying it doesn't know how to process \something.  It
> sounds like you want bytea but don't want the ability to use backslash
> escapes to input the bytea values.  I am unsure how to accomplish that.
>
> --
>  Bruce Momjian  <bruce(at)momjian(dot)us>        http://momjian.us
>  EnterpriseDB                             http://enterprisedb.com
>
>  + It's impossible for everything to be true. +
>

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Tom Lane 2011-03-16 16:10:57 Re: converting E'C:\\something' to bytea
Previous Message Bruce Momjian 2011-03-16 15:51:46 Re: converting E'C:\\something' to bytea