Thread: Custom type with width specifier
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/
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
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.
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