mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-11-25 13:51:19 +00:00
Revert "try to fix combine_transition_tables parse error"
This reverts commit 75d00a4626
.
This commit is contained in:
parent
75d00a4626
commit
5a18acacff
1 changed files with 40 additions and 60 deletions
|
@ -36,62 +36,42 @@ BEGIN
|
||||||
END
|
END
|
||||||
$$;
|
$$;
|
||||||
|
|
||||||
-- Create functions that select both old and new rows in a trigger. Column 1 is `-1` if old and `1` if new,
|
-- Selects both old and new rows in a trigger and allows using `sum(count_diff)` to get the number to add to a count
|
||||||
-- which can be used with `sum` to get the number to add to a count. Column 2 is the original row as a composite
|
CREATE FUNCTION r.combine_transition_tables (tg_op text)
|
||||||
-- value. A separate function is called in each `IF` statement to prevent an error from referencing transition
|
RETURNS SETOF record
|
||||||
-- tables that don't exist. All of this could be one function, but that would require using `RETURN QUERY EXECUTE`
|
LANGUAGE plpgsql
|
||||||
-- instead of calls to separate functions because of PostgreSQL's limited polymorphism. Parsing and planning dynamic
|
AS $$
|
||||||
-- queries at runtime is worse for performance.
|
|
||||||
CREATE PROCEDURE r.combine_transition_tables_function (table_name text)
|
|
||||||
LANGUAGE plpgsql
|
|
||||||
AS $a$
|
|
||||||
BEGIN
|
BEGIN
|
||||||
EXECUTE replace($b$
|
IF (TG_OP = 'UPDATE') THEN
|
||||||
CREATE FUNCTION r.get_old_thing_rows ()
|
RETURN QUERY
|
||||||
RETURNS SETOF record
|
SELECT
|
||||||
LANGUAGE plpgsql
|
-1 AS count_diff,
|
||||||
AS $$
|
old_table AS affected_row
|
||||||
BEGIN
|
FROM
|
||||||
RETURN QUERY SELECT -1, old_table FROM old_table;
|
old_table
|
||||||
RETURN;
|
UNION ALL
|
||||||
END
|
SELECT
|
||||||
$$;
|
1 AS count_diff,
|
||||||
CREATE FUNCTION r.get_new_thing_rows ()
|
new_table AS affected_row
|
||||||
RETURNS SETOF record
|
FROM
|
||||||
LANGUAGE plpgsql
|
new_table;
|
||||||
AS $$
|
ELSIF (TG_OP = 'INSERT') THEN
|
||||||
BEGIN
|
RETURN QUERY
|
||||||
RETURN QUERY SELECT 1, new_table FROM new_table;
|
SELECT
|
||||||
RETURN;
|
1 AS count_diff,
|
||||||
END
|
*
|
||||||
$$;
|
FROM
|
||||||
CREATE FUNCTION r.combine_thing_transition_tables (tg_op text)
|
new_table;
|
||||||
RETURNS SETOF record
|
ELSE
|
||||||
LANGUAGE plpgsql
|
RETURN QUERY
|
||||||
AS $$
|
SELECT
|
||||||
BEGIN
|
-1 AS count_diff,
|
||||||
IF (TG_OP IN ('UPDATE', 'DELETE')) THEN
|
*
|
||||||
RETURN QUERY SELECT * FROM r.get_old_thing_rows () AS (count_diff bigint, thing thing);
|
FROM
|
||||||
END IF;
|
old_table;
|
||||||
IF (TG_OP IN ('UPDATE', 'INSERT')) THEN
|
END IF;
|
||||||
RETURN QUERY SELECT * FROM r.get_new_thing_rows () AS (count_diff bigint, thing thing);
|
|
||||||
END IF;
|
|
||||||
RETURN;
|
|
||||||
END
|
|
||||||
$$;
|
|
||||||
$b$, 'thing', table_name);
|
|
||||||
END
|
END
|
||||||
$a$;
|
$$;
|
||||||
|
|
||||||
CALL r.combine_transition_tables_function('comment');
|
|
||||||
|
|
||||||
CALL r.combine_transition_tables_function('community');
|
|
||||||
|
|
||||||
CALL r.combine_transition_tables_function('community_follower');
|
|
||||||
|
|
||||||
CALL r.combine_transition_tables_function('person');
|
|
||||||
|
|
||||||
CALL r.combine_transition_tables_function('post');
|
|
||||||
|
|
||||||
-- Creates triggers for all operation types, which can't be 1 trigger when transition tables are used
|
-- Creates triggers for all operation types, which can't be 1 trigger when transition tables are used
|
||||||
CREATE PROCEDURE r.create_triggers (table_name text, function_name text)
|
CREATE PROCEDURE r.create_triggers (table_name text, function_name text)
|
||||||
|
@ -168,7 +148,7 @@ BEGIN
|
||||||
sum(count_diff) FILTER (WHERE (thing_like).score = 1) AS upvotes,
|
sum(count_diff) FILTER (WHERE (thing_like).score = 1) AS upvotes,
|
||||||
sum(count_diff) FILTER (WHERE (thing_like).score != 1) AS downvotes
|
sum(count_diff) FILTER (WHERE (thing_like).score != 1) AS downvotes
|
||||||
FROM
|
FROM
|
||||||
r.combine_thing_transition_tables (TG_OP)
|
r.combine_transition_tables (TG_OP)
|
||||||
AS (count_diff bigint,
|
AS (count_diff bigint,
|
||||||
thing_like thing_like)
|
thing_like thing_like)
|
||||||
GROUP BY
|
GROUP BY
|
||||||
|
@ -218,7 +198,7 @@ BEGIN
|
||||||
(comment).local,
|
(comment).local,
|
||||||
sum(count_diff) AS comments
|
sum(count_diff) AS comments
|
||||||
FROM
|
FROM
|
||||||
r.combine_comment_transition_tables (TG_OP)
|
r.combine_transition_tables (TG_OP)
|
||||||
AS (count_diff bigint,
|
AS (count_diff bigint,
|
||||||
comment comment)
|
comment comment)
|
||||||
WHERE
|
WHERE
|
||||||
|
@ -321,7 +301,7 @@ BEGIN
|
||||||
(post).local,
|
(post).local,
|
||||||
sum(count_diff) AS posts
|
sum(count_diff) AS posts
|
||||||
FROM
|
FROM
|
||||||
r.combine_post_transition_tables (TG_OP)
|
r.combine_transition_tables (TG_OP)
|
||||||
AS (count_diff bigint,
|
AS (count_diff bigint,
|
||||||
post post)
|
post post)
|
||||||
WHERE
|
WHERE
|
||||||
|
@ -377,7 +357,7 @@ BEGIN
|
||||||
SELECT
|
SELECT
|
||||||
sum(count_diff) AS communities
|
sum(count_diff) AS communities
|
||||||
FROM
|
FROM
|
||||||
r.combine_community_transition_tables (TG_OP)
|
r.combine_transition_tables (TG_OP)
|
||||||
AS (count_diff bigint, community community)
|
AS (count_diff bigint, community community)
|
||||||
WHERE (community).local AND NOT ((community).deleted OR (community).removed)) AS diff;
|
WHERE (community).local AND NOT ((community).deleted OR (community).removed)) AS diff;
|
||||||
RETURN NULL;
|
RETURN NULL;
|
||||||
|
@ -399,7 +379,7 @@ BEGIN
|
||||||
SELECT
|
SELECT
|
||||||
sum(count_diff) AS users
|
sum(count_diff) AS users
|
||||||
FROM
|
FROM
|
||||||
r.combine_person_transition_tables (TG_OP)
|
r.combine_transition_tables (TG_OP)
|
||||||
AS (count_diff bigint, person person)
|
AS (count_diff bigint, person person)
|
||||||
WHERE (person).local) AS diff;
|
WHERE (person).local) AS diff;
|
||||||
RETURN NULL;
|
RETURN NULL;
|
||||||
|
@ -470,7 +450,7 @@ BEGIN
|
||||||
(community_follower).community_id,
|
(community_follower).community_id,
|
||||||
sum(count_diff) AS subscribers
|
sum(count_diff) AS subscribers
|
||||||
FROM
|
FROM
|
||||||
r.combine_community_follower_transition_tables (TG_OP)
|
r.combine_transition_tables (TG_OP)
|
||||||
AS (count_diff bigint, community_follower community_follower)
|
AS (count_diff bigint, community_follower community_follower)
|
||||||
WHERE (
|
WHERE (
|
||||||
SELECT
|
SELECT
|
||||||
|
|
Loading…
Reference in a new issue