forked from zanfranceschi/rinha-de-backend-2024-q1
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathddl.sql
62 lines (52 loc) · 1.49 KB
/
ddl.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
CREATE UNLOGGED TABLE public.clientes (
id SERIAL PRIMARY KEY NOT NULL,
nome VARCHAR(25) NOT NULL,
limite INT NOT NULL,
saldo INT NOT NULL
);
CREATE UNLOGGED TABLE public.transacoes (
id SERIAL PRIMARY KEY NOT NULL,
valor INT NOT NULL,
descricao VARCHAR(10) NOT NULL,
realizada_em TIMESTAMP NOT NULL,
id_cliente INT NOT NULL
);
CREATE INDEX ix_transacoes_id_cliente ON public.transacoes
(
id_cliente ASC
);
CREATE OR REPLACE FUNCTION public.insere_transacao(
IN id_cliente INT,
IN valor INT,
IN descricao VARCHAR(10)
) RETURNS RECORD AS $$
DECLARE rec_cliente RECORD;
BEGIN
SELECT limite, saldo FROM public.clientes
INTO rec_cliente
WHERE id = id_cliente
FOR UPDATE;
IF rec_cliente.limite IS NULL THEN
SELECT -1 INTO rec_cliente;
RETURN rec_cliente;
END IF;
IF (valor < 0) AND (rec_cliente.saldo + rec_cliente.limite + valor) < 0 THEN
SELECT -2 INTO rec_cliente;
RETURN rec_cliente;
END IF;
INSERT INTO public.transacoes (valor, descricao, realizada_em, id_cliente)
VALUES (valor, descricao, now(), id_cliente);
UPDATE public.clientes
SET saldo = saldo + valor
WHERE id = id_cliente
RETURNING limite, saldo
INTO rec_cliente;
RETURN rec_cliente;
END;$$ LANGUAGE plpgsql;
INSERT INTO public.clientes (nome, limite, saldo)
VALUES
('o barato sai caro', 1000 * 100, 0),
('zan corp ltda', 800 * 100, 0),
('les cruders', 10000 * 100, 0),
('padaria joia de cocaia', 100000 * 100, 0),
('kid mais', 5000 * 100, 0);