Report of some problem under PL/PGSQL 7.4.7 & 8.0.1

Поиск
Список
Период
Сортировка
От Froggy / Froggy Corp.
Тема Report of some problem under PL/PGSQL 7.4.7 & 8.0.1
Дата
Msg-id 421DCE1E.638C7900@froggycorp.com
обсуждение исходный текст
Ответы Re: Report of some problem under PL/PGSQL 7.4.7 & 8.0.1  (Stephan Szabo <sszabo@megazone.bigpanda.com>)
Список pgsql-general
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,

В списке pgsql-general по дате отправления:

Предыдущее
От: Ulrich Wisser
Дата:
Сообщение: Fedora postgresql not starting
Следующее
От: Devrim GUNDUZ
Дата:
Сообщение: Re: Fedora postgresql not starting