From: | Stephan Szabo <sszabo(at)megazone(dot)bigpanda(dot)com> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | pgsql-general(at)postgresql(dot)org |
Subject: | Re: SELECT CAST(123 AS char) -> 1 |
Date: | 2008-02-14 23:35:28 |
Message-ID: | 20080214152432.U73871@megazone.bigpanda.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
[Way behind on reading stuff - so I hope this wasn't covered later]
On Tue, 12 Feb 2008, Tom Lane wrote:
> Ken Johanson <pg-user(at)kensystem(dot)com> writes:
> > For sake of interoperability (and using an API that requires String-type
> > hashtable keys), I'm trying to find a single CAST (int -> var/char)
> > syntax that works between the most databases. Only char seems to be a
> > candidate, but in 8.3 casting from an integer outputs only the first char...
>
> > Is this a bug, or would someone like to horrify me by stating something
> > like "spec says this is correct". :-)
>
> Okay: the spec says this is correct.
>
> SQL92 section 6.1 <data type> quoth
>
> <character string type> ::=
> CHARACTER [ <left paren> <length> <right paren> ]
> | CHAR [ <left paren> <length> <right paren> ]
>
> ...
>
> 4) If <length> is omitted, then a <length> of 1 is implicit.
>
> Therefore, writing just "char" is defined as equivalent to "char(1)".
>
> Also, section 6.10 <cast specification> defines an explicit cast to
> a fixed-length string type as truncating or padding to the target
> length (LTD):
>
> Case:
>
> i) If the length in characters of SV is equal to LTD, then TV
> is SV.
>
> ii) If the length in characters of SV is larger than LTD, then
> TV is the first LTD characters of SV. If any of the re-
> maining characters of SV are non-<space> characters, then a
> completion condition is raised: warning-string data, right
> truncation.
>
> iii) If the length in characters M of SV is smaller than LTD,
> then TV is SV extended on the right by LTD-M <space>s.
Are you sure that's the correct section to be using? Isn't that 6.10
General Rules 5c which is if the source type is a fixed or variable
length character string? Wouldn't the correct place for an int->char
conversion be 5a or am I misreading it?
5) If TD is fixed-length character string, then let LTD be the
length in characters of TD.
Case:
a) If SD is exact numeric, then let YP be the shortest character
string that conforms to the definition of <exact numeric
literal> in Subclause 5.3, "<literal>", whose scale is the
same as the scale of SD and whose interpreted value is the
absolute value of SV.
If SV is less than 0, then let Y be the result of
'-' | YP
Otherwise, let Y be YP.
Case:
i) If Y contains any <SQL language character> that is not
in the repertoire of TD, then an exception condition is
raised: data exception-invalid character value for cast.
ii) If the length in characters LY of Y is equal to LTD, then
TV is Y.
iii) If the length in characters LY of Y is less than LTD, then
TV is Y extended on the right by LTD-LY <space>s.
iv) Otherwise, an exception condition is raised: data exception-
string data, right truncation.
From | Date | Subject | |
---|---|---|---|
Next Message | Jeff Davis | 2008-02-15 00:07:42 | Re: Strict-typing benefits/costs |
Previous Message | Tom Lane | 2008-02-14 23:34:01 | Re: Strict-typing benefits/costs |