Re: Number of dimensions of an array parameter - Mailing list pgsql-hackers
From | Stefan Kaltenbrunner |
---|---|
Subject | Re: Number of dimensions of an array parameter |
Date | |
Msg-id | 445F7D44.8090404@kaltenbrunner.cc Whole thread Raw |
In response to | Number of dimensions of an array parameter (Thomas Hallgren <thomas@tada.se>) |
Responses |
Re: Number of dimensions of an array parameter
|
List | pgsql-hackers |
Thomas Hallgren wrote: > I can create a function that takes a two dimension int array: > > CREATE FUNCTION twodims(int[][]) RETURNS void AS ... > > but there's nothing stopping me from calling this function with an > arbitrary number of dimensions on the array. > > I'd like to map a parameter like the one above to a corresponding > representation in Java (it would be int[][] there too). As it turns out, > I can't do that. PostgreSQL will not store any information that can tell > me how many dimensions that where used in the declaration, i.e. it's > impossible to write a language VALIDATOR that, based on the information > in pg_proc, builds a signature where the number of dimensions is reflected. > > This leaves me with two choices: > > Only allow arrays with one dimension unless the parameter is of a domain > type (domains are apparently stored with the actual number of > dimensions). Any call that uses an array parameter with more then one > dimension will yield an exception. > --OR-- > Always map to Object[] instead of mapping to the correct type, . This > will work since an array in Java is also an Object and all primitive > types can be represented as objects (i.e. int can be a > java.lang.Integer). The strong typing and the ability to use primitives > are lost however. > > I'm leaning towards #1 and hoping that PostgreSQL will enhance the > parameter type declarations to include the dimensions in future releases. > > ... After some more testing ... > > Unfortunately, I run into problems even when I use domains. Consider the > following: > > thhal=# CREATE DOMAIN twodims as int[][]; > CREATE DOMAIN > thhal=# SELECT typndims FROM pg_type WHERE typname = 'twodims'; > typndims > ---------- > 2 > (1 row) > > thhal=# SELECT > array_dims('{{{1,2,3},{3,4,3}},{{5,3,2},{9,9,9}}}'::twodims); > array_dims ----------------- > [1:2][1:2][1:3] > (1 row) > > IMO, there is something seriously wrong here. Clearly the number of > dimensions is a property of the type. Any array with a different number > of dimensions should yield an error or at least be coerced into the > right number of dimensions. while it would be nice to improve that - it is actually documented quite clearly. http://www.postgresql.org/docs/current/static/arrays.html has: "However, the current implementation does not enforce the array size limits — the behavior is the same as for arrays of unspecified length. Actually, the current implementation does not enforce the declared number of dimensions either. Arrays of a particular element type are all considered to be of the same type, regardless of size or number of dimensions. So, declaring number of dimensions or sizes in CREATE TABLE is simply documentation, it does not affect run-time behavior. " Stefan
pgsql-hackers by date: