Thread: Custom type with width specifier

Custom type with width specifier

From
Shachar Shemesh
Date:
Hi list,

I'm trying to create a varchar clone (called varcharci). I have defined 
new functions called "varcharciin", "varcharciout", "varcharcisend" and 
"recv", using the "varcharin" etc. definitions (i.e. - builtin 
functions). I defined the type. Everything works, except that when I try 
to create a table it fails. This only happens when I try to give maximum 
length to the type. So the command:
create table foo ( bar varcharci );
succeeds, but
create table foo (bar varcharci(12) );
fails.

What do I need to do in order to get the width specifier into my type? 
I'm not even sure what function is called in order to say that the type 
needs a width specifier.

Many thanks            Shachar

-- 
Shachar Shemesh
Lingnu Open Source Consulting ltd.
http://www.lingnu.com/



Re: Custom type with width specifier

From
Tom Lane
Date:
Shachar Shemesh <psql@shemesh.biz> writes:
> What do I need to do in order to get the width specifier into my type? 

Rewrite the grammar.  Width modifiers are only supported on types that
are hard-wired into the grammar, mainly because they look way too much
like function calls to be distinguished without special hacking.

Consider for example the implications of the fact that this works:

regression=# select numeric(17,10) '1.23';  numeric
--------------1.2300000000
(1 row)
bison has to decide *before scanning beyond the left parenthesis*
whether "numeric" is a function name or a type name.

If you can think of a more general solution, I'm all ears, but it looks
like a hard problem that would require considerable rethinking of the
present grammar for these things.
        regards, tom lane


Re: Custom type with width specifier

From
Peter Eisentraut
Date:
Shachar Shemesh wrote:
> What do I need to do in order to get the width specifier into my
> type?

This is not possible with user-defined types.



Re: Custom type with width specifier

From
Hannu Krosing
Date:
On P, 2004-06-27 at 17:53, Tom Lane wrote:
> Shachar Shemesh <psql@shemesh.biz> writes:
> > What do I need to do in order to get the width specifier into my type? 
> 
> Rewrite the grammar.  Width modifiers are only supported on types that
> are hard-wired into the grammar, mainly because they look way too much
> like function calls to be distinguished without special hacking.
> 
> Consider for example the implications of the fact that this works:
> 
> regression=# select numeric(17,10) '1.23';
>    numeric
> --------------
>  1.2300000000
> (1 row)
>  
> bison has to decide *before scanning beyond the left parenthesis*
> whether "numeric" is a function name or a type name.
> 
> If you can think of a more general solution, I'm all ears, but it looks
> like a hard problem that would require considerable rethinking of the
> present grammar for these things.

can't we make type(width) an actual function which returns another type
?

this would make it even possible to add support for things like
NUMBER(17,10) as an alias for NUMERIC(17,10) as an user-level addon.

---------------
Hannu