Hi everyone,

        I made a tetris under pl/pgsql and i encounter some problem with this
non commun use of pl/pgsql. For each problem, i didn't see information
about them, so my report :

- Array problem (7.4.7 & 8.0.1) :

I got a lot of problem with using array, like i saw under the ML,
multidimensional array are not friendly to use so i used 1 dimension
array but i needed to put data at point (x,y).
The problem is how the array is created and how i can put data into it.
I use this little test function :

------------------------------
CREATE OR REPLACE FUNCTION test_array() RETURNS integer AS '
DECLARE
a integer;
b integer;
c integer;
array varchar[];
BEGIN

array := ''{}'';

a := 1;
WHILE a < 17 LOOP
        b := 1;
        WHILE b < 17 LOOP
c:= a + b * 16;
RAISE NOTICE ''%'', c;
                array[c] := ''&'';
                b := b + 1;
        END LOOP;
        a := a + 1;
END LOOP;


return 0;

END;
' LANGUAGE plpgsql;
----------------------------

Error message :

----------------------------
tetris=# select test_array();
NOTICE:  17
NOTICE:  33
ERROR:  invalid array subscripts
CONTEXT:  PL/pgSQL function "test_array" line 16 at assignment
----------------------------

To correct this error message, i need to make 2 init, the first with
"array := ''{}'';" and a second one by insert data into it with
incremential pointer :

a := 0;
WHILE a <= 999 LOOP
        array[a] := '' '';
END LOOP;

Then my function test_array() work properly.

But i dont understand why PL allow me to assign 2 times data into my
array with "random" pointer and not the 3rd times.

BTW, i dont really understand why i need to make "array := ''{}'';",
some people who test it from pgsqlfr-general ML try without making this
init and get not problem with "random" pointer. But array was <<null>>.


- Problem with table refresh

For my game, i need to detect keystroke, so i made an infinit loop
waiting for key to be press.
I have two case for 7.4.7 & 8.0.1, under 8.0.1 it seems to work
properly.

Under 7.4.7, i need to make :
WHILE a = 0 LOOP
        for rGetkey IN SELECT * FROM getkey LOOP
                a := 1;
        END LOOP;
        select into a count(key) FROM getkey;
END LOOP;

Or i will allways have "a = 0" (maybe i miss something).

But under 8.0.1, its ok with :
WHILE a = 0 LOOP
        select into a count(key) FROM getkey;
END LOOP;


- Some features :
I was surprise to see that i cant put any "'" after --. I thought it was
detect as comment, so all after it on the line will not be compile

Same as table refresh, i didnt understand why the function now() (7.4.7
& 8.0.1) dont refresh it self under a PL function and needed to use
timeofday();

The test function :

------------------------------------------
CREATE OR REPLACE FUNCTION test_now() RETURNS varchar AS '
DECLARE
a timestamp;
b integer;
BEGIN
b := 1;
while b <> 0 LOOP
        select into a now();
        RAISE NOTICE ''%'', a;
END LOOP;
return ''a'';

END;
' LANGUAGE plpgsql;
------------------------------------------

That's all,
Regards,

---------------------------(end of broadcast)---------------------------
TIP 9: the planner will ignore your desire to choose an index scan if your
      joining column's datatypes do not match

Reply via email to