In a PostgreSQL table for a word game I keep track of paying players either by the column vip_until
or by the column grand_until
having a valid date in future:
create table users (
uid serial primary key,
vip_until timestamp null, -- date in future indicates paying customer
grand_until timestamp null -- date in future indicates paying customer
);
I have written a short stored procedure to check that:
create or replace function is_vip(
IN in_uid integer,
OUT out_vip boolean
) as $BODY$
BEGIN
out_vip := exists(select 1 from users
where uid = in_uid and
greatest(vip_until, grand_until) > current_timestamp);
END;
$BODY$ language plpgsql;
Then I am trying to use the above function in another stored procedure:
create or replace function join_new_game(
IN in_uid integer,
IN in_letters varchar(130),
IN in_style integer,
OUT out_gid integer
) as $BODY$
BEGIN
/* maybe there is a new game already, just waiting for the player's 1st move*/
select gid into out_gid from games
where (player1 = in_uid and stamp1 is null)
or (player2 = in_uid and stamp2 is null) limit 1;
IF not found THEN
/* try to find games having just 1 player (with different uid) */
select gid into out_gid from games
where (player1 != in_uid and stamp1 is not null
and player2 is null) limit 1;
IF not found THEN
/* only allow board style 1 for non-paying customers */
IF not select is_vip(in_uid) THEN
in_style := 1; -- the above line fails
END IF;
/* create new game with player1 = uid and stamp1 = null */
insert into games (
created,
player1,
stamp1,
stamp2,
letters1,
letters2,
letters,
board,
style
) values (
current_timestamp,
in_uid,
null,
null,
substring(in_letters, 1, 7),
substring(in_letters, 8, 7),
substring(in_letters, 15),
rpad('', 225), -- fill 15x15 board
in_style
) returning gid into out_gid;
ELSE
update games set player2 = in_uid where gid = out_gid;
END IF;
END IF;
END;
$BODY$ language plpgsql;
But I get this syntax error:
ERROR: syntax error at or near "select" LINE 21: IF not select is_vip(in_uid) TH... ^
How to use the is_vip()
function properly?