From 36be1473ce69f622133bb5723a3577e20b7d74b0 Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Fri, 4 Jan 2019 07:20:01 +1100 Subject: [PATCH 01/20] merge --- .travis.yml | 3 + MANIFEST.in | 2 + synapse/storage/prepare_database.py | 22 +- .../schema/delta/54/user_ips_index.sql | 18 + .../schema/full_schemas/54/full.sql.postgres | 3186 +++++++++++++++++ .../schema/full_schemas/54/full.sql.sqlite | 1203 +++++++ .../schema/full_schemas/54/zzz-inserts.sql | 12 + synapse/storage/schema/full_schemas/README.md | 16 + 8 files changed, 4459 insertions(+), 3 deletions(-) create mode 100644 synapse/storage/schema/delta/54/user_ips_index.sql create mode 100644 synapse/storage/schema/full_schemas/54/full.sql.postgres create mode 100644 synapse/storage/schema/full_schemas/54/full.sql.sqlite create mode 100644 synapse/storage/schema/full_schemas/54/zzz-inserts.sql create mode 100644 synapse/storage/schema/full_schemas/README.md diff --git a/.travis.yml b/.travis.yml index 84d5efff9b00..728f0e248abf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,9 @@ cache: # - $HOME/.cache/pip/wheels +addons: + postgresql: "9.4" + # don't clone the whole repo history, one commit will do git: depth: 1 diff --git a/MANIFEST.in b/MANIFEST.in index 29303cc8b57c..2c023fd7a453 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -9,7 +9,9 @@ include demo/*.py include demo/*.sh recursive-include synapse/storage/schema *.sql +recursive-include synapse/storage/schema *.sql.* recursive-include synapse/storage/schema *.py +recursive-include synapse/storage/schema *.md recursive-include docs * recursive-include scripts * diff --git a/synapse/storage/prepare_database.py b/synapse/storage/prepare_database.py index fa36daac524d..48dd64e9a0ec 100644 --- a/synapse/storage/prepare_database.py +++ b/synapse/storage/prepare_database.py @@ -20,12 +20,14 @@ import os import re +from synapse.storage.engines.postgres import PostgresEngine + logger = logging.getLogger(__name__) # Remember to update this number every time a change is made to database # schema files, so the users will be informed on server restarts. -SCHEMA_VERSION = 53 +SCHEMA_VERSION = 54 dir_path = os.path.abspath(os.path.dirname(__file__)) @@ -115,13 +117,24 @@ def _setup_new_database(cur, database_engine): valid_dirs = [] pattern = re.compile(r"^\d+(\.sql)?$") + + if isinstance(database_engine, PostgresEngine): + specific = "postgres" + else: + specific = "sqlite" + + specific_pattern = re.compile(r"^\d+(\.sql." + specific + r")?$") + for filename in directory_entries: - match = pattern.match(filename) + match = pattern.match(filename) or specific_pattern.match(filename) abs_path = os.path.join(current_dir, filename) if match and os.path.isdir(abs_path): ver = int(match.group(0)) if ver <= SCHEMA_VERSION: valid_dirs.append((ver, abs_path)) + elif filename == "README.md": + # Ignore the readme + pass else: logger.warn("Unexpected entry in 'full_schemas': %s", filename) @@ -136,7 +149,10 @@ def _setup_new_database(cur, database_engine): directory_entries = os.listdir(sql_dir) - for filename in fnmatch.filter(directory_entries, "*.sql"): + for filename in sorted( + fnmatch.filter(directory_entries, "*.sql") + + fnmatch.filter(directory_entries, "*.sql." + specific) + ): sql_loc = os.path.join(sql_dir, filename) logger.debug("Applying schema %s", sql_loc) executescript(cur, sql_loc) diff --git a/synapse/storage/schema/delta/54/user_ips_index.sql b/synapse/storage/schema/delta/54/user_ips_index.sql new file mode 100644 index 000000000000..292bcbe8e998 --- /dev/null +++ b/synapse/storage/schema/delta/54/user_ips_index.sql @@ -0,0 +1,18 @@ +/* Copyright 2018 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +-- add a new unique index to user_ips table +INSERT INTO background_updates (update_name, progress_json) VALUES + ('user_ips_device_unique_index', '{}'); diff --git a/synapse/storage/schema/full_schemas/54/full.sql.postgres b/synapse/storage/schema/full_schemas/54/full.sql.postgres new file mode 100644 index 000000000000..245db5aff0b1 --- /dev/null +++ b/synapse/storage/schema/full_schemas/54/full.sql.postgres @@ -0,0 +1,3186 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 11.1 +-- Dumped by pg_dump version 11.1 + +-- +-- Name: access_tokens; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE access_tokens ( + id bigint NOT NULL, + user_id text NOT NULL, + device_id text, + token text NOT NULL, + last_used bigint +); + + +-- +-- Name: account_data; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE account_data ( + user_id text NOT NULL, + account_data_type text NOT NULL, + stream_id bigint NOT NULL, + content text NOT NULL +); + + +-- +-- Name: account_data_max_stream_id; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE account_data_max_stream_id ( + lock character(1) DEFAULT 'X'::bpchar NOT NULL, + stream_id bigint NOT NULL, + CONSTRAINT private_user_data_max_stream_id_lock_check CHECK ((lock = 'X'::bpchar)) +); + + +-- +-- Name: application_services; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE application_services ( + id bigint NOT NULL, + url text, + token text, + hs_token text, + sender text +); + + +-- +-- Name: application_services_regex; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE application_services_regex ( + id bigint NOT NULL, + as_id bigint NOT NULL, + namespace integer, + regex text +); + + +-- +-- Name: application_services_state; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE application_services_state ( + as_id text NOT NULL, + state character varying(5), + last_txn integer +); + + +-- +-- Name: application_services_txns; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE application_services_txns ( + as_id text NOT NULL, + txn_id integer NOT NULL, + event_ids text NOT NULL +); + + +-- +-- Name: appservice_room_list; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE appservice_room_list ( + appservice_id text NOT NULL, + network_id text NOT NULL, + room_id text NOT NULL +); + + +-- +-- Name: appservice_stream_position; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE appservice_stream_position ( + lock character(1) DEFAULT 'X'::bpchar NOT NULL, + stream_ordering bigint, + CONSTRAINT appservice_stream_position_lock_check CHECK ((lock = 'X'::bpchar)) +); + + +-- +-- Name: background_updates; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE background_updates ( + update_name text NOT NULL, + progress_json text NOT NULL, + depends_on text +); + + +-- +-- Name: blocked_rooms; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE blocked_rooms ( + room_id text NOT NULL, + user_id text NOT NULL +); + + +-- +-- Name: cache_invalidation_stream; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE cache_invalidation_stream ( + stream_id bigint, + cache_func text, + keys text[], + invalidation_ts bigint +); + + +-- +-- Name: current_state_delta_stream; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE current_state_delta_stream ( + stream_id bigint NOT NULL, + room_id text NOT NULL, + type text NOT NULL, + state_key text NOT NULL, + event_id text, + prev_event_id text +); + + +-- +-- Name: current_state_events; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE current_state_events ( + event_id text NOT NULL, + room_id text NOT NULL, + type text NOT NULL, + state_key text NOT NULL +); + + +-- +-- Name: current_state_resets; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE current_state_resets ( + event_stream_ordering bigint NOT NULL +); + + +-- +-- Name: deleted_pushers; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE deleted_pushers ( + stream_id bigint NOT NULL, + app_id text NOT NULL, + pushkey text NOT NULL, + user_id text NOT NULL +); + + +-- +-- Name: destinations; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE destinations ( + destination text NOT NULL, + retry_last_ts bigint, + retry_interval integer +); + + +-- +-- Name: device_federation_inbox; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE device_federation_inbox ( + origin text NOT NULL, + message_id text NOT NULL, + received_ts bigint NOT NULL +); + + +-- +-- Name: device_federation_outbox; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE device_federation_outbox ( + destination text NOT NULL, + stream_id bigint NOT NULL, + queued_ts bigint NOT NULL, + messages_json text NOT NULL +); + + +-- +-- Name: device_inbox; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE device_inbox ( + user_id text NOT NULL, + device_id text NOT NULL, + stream_id bigint NOT NULL, + message_json text NOT NULL +); + + +-- +-- Name: device_lists_outbound_last_success; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE device_lists_outbound_last_success ( + destination text NOT NULL, + user_id text NOT NULL, + stream_id bigint NOT NULL +); + + +-- +-- Name: device_lists_outbound_pokes; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE device_lists_outbound_pokes ( + destination text NOT NULL, + stream_id bigint NOT NULL, + user_id text NOT NULL, + device_id text NOT NULL, + sent boolean NOT NULL, + ts bigint NOT NULL +); + + +-- +-- Name: device_lists_remote_cache; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE device_lists_remote_cache ( + user_id text NOT NULL, + device_id text NOT NULL, + content text NOT NULL +); + + +-- +-- Name: device_lists_remote_extremeties; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE device_lists_remote_extremeties ( + user_id text NOT NULL, + stream_id text NOT NULL +); + + +-- +-- Name: device_lists_stream; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE device_lists_stream ( + stream_id bigint NOT NULL, + user_id text NOT NULL, + device_id text NOT NULL +); + + +-- +-- Name: device_max_stream_id; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE device_max_stream_id ( + stream_id bigint NOT NULL +); + + +-- +-- Name: devices; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE devices ( + user_id text NOT NULL, + device_id text NOT NULL, + display_name text +); + + +-- +-- Name: e2e_device_keys_json; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE e2e_device_keys_json ( + user_id text NOT NULL, + device_id text NOT NULL, + ts_added_ms bigint NOT NULL, + key_json text NOT NULL +); + + +-- +-- Name: e2e_one_time_keys_json; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE e2e_one_time_keys_json ( + user_id text NOT NULL, + device_id text NOT NULL, + algorithm text NOT NULL, + key_id text NOT NULL, + ts_added_ms bigint NOT NULL, + key_json text NOT NULL +); + + +-- +-- Name: e2e_room_keys; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE e2e_room_keys ( + user_id text NOT NULL, + room_id text NOT NULL, + session_id text NOT NULL, + version bigint NOT NULL, + first_message_index integer, + forwarded_count integer, + is_verified boolean, + session_data text NOT NULL +); + + +-- +-- Name: e2e_room_keys_versions; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE e2e_room_keys_versions ( + user_id text NOT NULL, + version bigint NOT NULL, + algorithm text NOT NULL, + auth_data text NOT NULL, + deleted smallint DEFAULT 0 NOT NULL +); + + +-- +-- Name: erased_users; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE erased_users ( + user_id text NOT NULL +); + + +-- +-- Name: event_auth; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_auth ( + event_id text NOT NULL, + auth_id text NOT NULL, + room_id text NOT NULL +); + + +-- +-- Name: event_backward_extremities; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_backward_extremities ( + event_id text NOT NULL, + room_id text NOT NULL +); + + +-- +-- Name: event_content_hashes; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_content_hashes ( + event_id text, + algorithm text, + hash bytea +); + + +-- +-- Name: event_destinations; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_destinations ( + event_id text NOT NULL, + destination text NOT NULL, + delivered_ts bigint DEFAULT 0 +); + + +-- +-- Name: event_edge_hashes; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_edge_hashes ( + event_id text, + prev_event_id text, + algorithm text, + hash bytea +); + + +-- +-- Name: event_edges; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_edges ( + event_id text NOT NULL, + prev_event_id text NOT NULL, + room_id text NOT NULL, + is_state boolean NOT NULL +); + + +-- +-- Name: event_forward_extremities; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_forward_extremities ( + event_id text NOT NULL, + room_id text NOT NULL +); + + +-- +-- Name: event_json; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_json ( + event_id text NOT NULL, + room_id text NOT NULL, + internal_metadata text NOT NULL, + json text NOT NULL +); + + +-- +-- Name: event_push_actions; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_push_actions ( + room_id text NOT NULL, + event_id text NOT NULL, + user_id text NOT NULL, + profile_tag character varying(32), + actions text NOT NULL, + topological_ordering bigint, + stream_ordering bigint, + notif smallint, + highlight smallint +); + + +-- +-- Name: event_push_actions_staging; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_push_actions_staging ( + event_id text NOT NULL, + user_id text NOT NULL, + actions text NOT NULL, + notif smallint NOT NULL, + highlight smallint NOT NULL +); + + +-- +-- Name: event_push_summary; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_push_summary ( + user_id text NOT NULL, + room_id text NOT NULL, + notif_count bigint NOT NULL, + stream_ordering bigint NOT NULL +); + + +-- +-- Name: event_push_summary_stream_ordering; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_push_summary_stream_ordering ( + lock character(1) DEFAULT 'X'::bpchar NOT NULL, + stream_ordering bigint NOT NULL, + CONSTRAINT event_push_summary_stream_ordering_lock_check CHECK ((lock = 'X'::bpchar)) +); + + +-- +-- Name: event_reference_hashes; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_reference_hashes ( + event_id text, + algorithm text, + hash bytea +); + + +-- +-- Name: event_reports; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_reports ( + id bigint NOT NULL, + received_ts bigint NOT NULL, + room_id text NOT NULL, + event_id text NOT NULL, + user_id text NOT NULL, + reason text, + content text +); + + +-- +-- Name: event_search; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_search ( + event_id text, + room_id text, + sender text, + key text, + vector tsvector, + origin_server_ts bigint, + stream_ordering bigint +); + + +-- +-- Name: event_signatures; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_signatures ( + event_id text, + signature_name text, + key_id text, + signature bytea +); + + +-- +-- Name: event_to_state_groups; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE event_to_state_groups ( + event_id text NOT NULL, + state_group bigint NOT NULL +); + + +-- +-- Name: events; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE events ( + stream_ordering integer NOT NULL, + topological_ordering bigint NOT NULL, + event_id text NOT NULL, + type text NOT NULL, + room_id text NOT NULL, + content text, + unrecognized_keys text, + processed boolean NOT NULL, + outlier boolean NOT NULL, + depth bigint DEFAULT 0 NOT NULL, + origin_server_ts bigint, + received_ts bigint, + sender text, + contains_url boolean +); + + +-- +-- Name: ex_outlier_stream; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE ex_outlier_stream ( + event_stream_ordering bigint NOT NULL, + event_id text NOT NULL, + state_group bigint NOT NULL +); + + +-- +-- Name: federation_stream_position; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE federation_stream_position ( + type text NOT NULL, + stream_id integer NOT NULL +); + + +-- +-- Name: feedback; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE feedback ( + event_id text NOT NULL, + feedback_type text, + target_event_id text, + sender text, + room_id text +); + + +-- +-- Name: group_attestations_remote; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE group_attestations_remote ( + group_id text NOT NULL, + user_id text NOT NULL, + valid_until_ms bigint NOT NULL, + attestation_json text NOT NULL +); + + +-- +-- Name: group_attestations_renewals; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE group_attestations_renewals ( + group_id text NOT NULL, + user_id text NOT NULL, + valid_until_ms bigint NOT NULL +); + + +-- +-- Name: group_invites; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE group_invites ( + group_id text NOT NULL, + user_id text NOT NULL +); + + +-- +-- Name: group_roles; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE group_roles ( + group_id text NOT NULL, + role_id text NOT NULL, + profile text NOT NULL, + is_public boolean NOT NULL +); + + +-- +-- Name: group_room_categories; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE group_room_categories ( + group_id text NOT NULL, + category_id text NOT NULL, + profile text NOT NULL, + is_public boolean NOT NULL +); + + +-- +-- Name: group_rooms; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE group_rooms ( + group_id text NOT NULL, + room_id text NOT NULL, + is_public boolean NOT NULL +); + + +-- +-- Name: group_summary_roles; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE group_summary_roles ( + group_id text NOT NULL, + role_id text NOT NULL, + role_order bigint NOT NULL, + CONSTRAINT group_summary_roles_role_order_check CHECK ((role_order > 0)) +); + + +-- +-- Name: group_summary_room_categories; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE group_summary_room_categories ( + group_id text NOT NULL, + category_id text NOT NULL, + cat_order bigint NOT NULL, + CONSTRAINT group_summary_room_categories_cat_order_check CHECK ((cat_order > 0)) +); + + +-- +-- Name: group_summary_rooms; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE group_summary_rooms ( + group_id text NOT NULL, + room_id text NOT NULL, + category_id text NOT NULL, + room_order bigint NOT NULL, + is_public boolean NOT NULL, + CONSTRAINT group_summary_rooms_room_order_check CHECK ((room_order > 0)) +); + + +-- +-- Name: group_summary_users; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE group_summary_users ( + group_id text NOT NULL, + user_id text NOT NULL, + role_id text NOT NULL, + user_order bigint NOT NULL, + is_public boolean NOT NULL +); + + +-- +-- Name: group_users; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE group_users ( + group_id text NOT NULL, + user_id text NOT NULL, + is_admin boolean NOT NULL, + is_public boolean NOT NULL +); + + +-- +-- Name: groups; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE groups ( + group_id text NOT NULL, + name text, + avatar_url text, + short_description text, + long_description text, + is_public boolean NOT NULL, + join_policy text DEFAULT 'invite'::text NOT NULL +); + + +-- +-- Name: guest_access; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE guest_access ( + event_id text NOT NULL, + room_id text NOT NULL, + guest_access text NOT NULL +); + + +-- +-- Name: history_visibility; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE history_visibility ( + event_id text NOT NULL, + room_id text NOT NULL, + history_visibility text NOT NULL +); + + +-- +-- Name: local_group_membership; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE local_group_membership ( + group_id text NOT NULL, + user_id text NOT NULL, + is_admin boolean NOT NULL, + membership text NOT NULL, + is_publicised boolean NOT NULL, + content text NOT NULL +); + + +-- +-- Name: local_group_updates; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE local_group_updates ( + stream_id bigint NOT NULL, + group_id text NOT NULL, + user_id text NOT NULL, + type text NOT NULL, + content text NOT NULL +); + + +-- +-- Name: local_invites; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE local_invites ( + stream_id bigint NOT NULL, + inviter text NOT NULL, + invitee text NOT NULL, + event_id text NOT NULL, + room_id text NOT NULL, + locally_rejected text, + replaced_by text +); + + +-- +-- Name: local_media_repository; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE local_media_repository ( + media_id text, + media_type text, + media_length integer, + created_ts bigint, + upload_name text, + user_id text, + quarantined_by text, + url_cache text, + last_access_ts bigint +); + + +-- +-- Name: local_media_repository_thumbnails; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE local_media_repository_thumbnails ( + media_id text, + thumbnail_width integer, + thumbnail_height integer, + thumbnail_type text, + thumbnail_method text, + thumbnail_length integer +); + + +-- +-- Name: local_media_repository_url_cache; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE local_media_repository_url_cache ( + url text, + response_code integer, + etag text, + expires_ts bigint, + og text, + media_id text, + download_ts bigint +); + + +-- +-- Name: monthly_active_users; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE monthly_active_users ( + user_id text NOT NULL, + "timestamp" bigint NOT NULL +); + + +-- +-- Name: open_id_tokens; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE open_id_tokens ( + token text NOT NULL, + ts_valid_until_ms bigint NOT NULL, + user_id text NOT NULL +); + + +-- +-- Name: presence; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE presence ( + user_id text NOT NULL, + state character varying(20), + status_msg text, + mtime bigint +); + + +-- +-- Name: presence_allow_inbound; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE presence_allow_inbound ( + observed_user_id text NOT NULL, + observer_user_id text NOT NULL +); + + +-- +-- Name: presence_list; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE presence_list ( + user_id text NOT NULL, + observed_user_id text NOT NULL, + accepted boolean NOT NULL +); + + +-- +-- Name: presence_stream; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE presence_stream ( + stream_id bigint, + user_id text, + state text, + last_active_ts bigint, + last_federation_update_ts bigint, + last_user_sync_ts bigint, + status_msg text, + currently_active boolean +); + + +-- +-- Name: profiles; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE profiles ( + user_id text NOT NULL, + displayname text, + avatar_url text +); + + +-- +-- Name: public_room_list_stream; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public_room_list_stream ( + stream_id bigint NOT NULL, + room_id text NOT NULL, + visibility boolean NOT NULL, + appservice_id text, + network_id text +); + + +-- +-- Name: push_rules; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE push_rules ( + id bigint NOT NULL, + user_name text NOT NULL, + rule_id text NOT NULL, + priority_class smallint NOT NULL, + priority integer DEFAULT 0 NOT NULL, + conditions text NOT NULL, + actions text NOT NULL +); + + +-- +-- Name: push_rules_enable; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE push_rules_enable ( + id bigint NOT NULL, + user_name text NOT NULL, + rule_id text NOT NULL, + enabled smallint +); + + +-- +-- Name: push_rules_stream; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE push_rules_stream ( + stream_id bigint NOT NULL, + event_stream_ordering bigint NOT NULL, + user_id text NOT NULL, + rule_id text NOT NULL, + op text NOT NULL, + priority_class smallint, + priority integer, + conditions text, + actions text +); + + +-- +-- Name: pusher_throttle; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE pusher_throttle ( + pusher bigint NOT NULL, + room_id text NOT NULL, + last_sent_ts bigint, + throttle_ms bigint +); + + +-- +-- Name: pushers; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE pushers ( + id bigint NOT NULL, + user_name text NOT NULL, + access_token bigint, + profile_tag text NOT NULL, + kind text NOT NULL, + app_id text NOT NULL, + app_display_name text NOT NULL, + device_display_name text NOT NULL, + pushkey text NOT NULL, + ts bigint NOT NULL, + lang text, + data text, + last_stream_ordering integer, + last_success bigint, + failing_since bigint +); + + +-- +-- Name: ratelimit_override; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE ratelimit_override ( + user_id text NOT NULL, + messages_per_second bigint, + burst_count bigint +); + + +-- +-- Name: receipts_graph; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE receipts_graph ( + room_id text NOT NULL, + receipt_type text NOT NULL, + user_id text NOT NULL, + event_ids text NOT NULL, + data text NOT NULL +); + + +-- +-- Name: receipts_linearized; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE receipts_linearized ( + stream_id bigint NOT NULL, + room_id text NOT NULL, + receipt_type text NOT NULL, + user_id text NOT NULL, + event_id text NOT NULL, + data text NOT NULL +); + + +-- +-- Name: received_transactions; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE received_transactions ( + transaction_id text, + origin text, + ts bigint, + response_code integer, + response_json bytea, + has_been_referenced smallint DEFAULT 0 +); + + +-- +-- Name: redactions; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE redactions ( + event_id text NOT NULL, + redacts text NOT NULL +); + + +-- +-- Name: rejections; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE rejections ( + event_id text NOT NULL, + reason text NOT NULL, + last_check text NOT NULL +); + + +-- +-- Name: remote_media_cache; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE remote_media_cache ( + media_origin text, + media_id text, + media_type text, + created_ts bigint, + upload_name text, + media_length integer, + filesystem_id text, + last_access_ts bigint, + quarantined_by text +); + + +-- +-- Name: remote_media_cache_thumbnails; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE remote_media_cache_thumbnails ( + media_origin text, + media_id text, + thumbnail_width integer, + thumbnail_height integer, + thumbnail_method text, + thumbnail_type text, + thumbnail_length integer, + filesystem_id text +); + + +-- +-- Name: remote_profile_cache; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE remote_profile_cache ( + user_id text NOT NULL, + displayname text, + avatar_url text, + last_check bigint NOT NULL +); + + +-- +-- Name: room_account_data; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE room_account_data ( + user_id text NOT NULL, + room_id text NOT NULL, + account_data_type text NOT NULL, + stream_id bigint NOT NULL, + content text NOT NULL +); + + +-- +-- Name: room_alias_servers; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE room_alias_servers ( + room_alias text NOT NULL, + server text NOT NULL +); + + +-- +-- Name: room_aliases; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE room_aliases ( + room_alias text NOT NULL, + room_id text NOT NULL, + creator text +); + + +-- +-- Name: room_depth; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE room_depth ( + room_id text NOT NULL, + min_depth integer NOT NULL +); + + +-- +-- Name: room_hosts; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE room_hosts ( + room_id text NOT NULL, + host text NOT NULL +); + + +-- +-- Name: room_memberships; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE room_memberships ( + event_id text NOT NULL, + user_id text NOT NULL, + sender text NOT NULL, + room_id text NOT NULL, + membership text NOT NULL, + forgotten integer DEFAULT 0, + display_name text, + avatar_url text +); + + +-- +-- Name: room_names; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE room_names ( + event_id text NOT NULL, + room_id text NOT NULL, + name text NOT NULL +); + + +-- +-- Name: room_tags; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE room_tags ( + user_id text NOT NULL, + room_id text NOT NULL, + tag text NOT NULL, + content text NOT NULL +); + + +-- +-- Name: room_tags_revisions; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE room_tags_revisions ( + user_id text NOT NULL, + room_id text NOT NULL, + stream_id bigint NOT NULL +); + + +-- +-- Name: rooms; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE rooms ( + room_id text NOT NULL, + is_public boolean, + creator text +); + + +-- +-- Name: server_keys_json; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE server_keys_json ( + server_name text NOT NULL, + key_id text NOT NULL, + from_server text NOT NULL, + ts_added_ms bigint NOT NULL, + ts_valid_until_ms bigint NOT NULL, + key_json bytea NOT NULL +); + + +-- +-- Name: server_signature_keys; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE server_signature_keys ( + server_name text, + key_id text, + from_server text, + ts_added_ms bigint, + verify_key bytea +); + + +-- +-- Name: server_tls_certificates; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE server_tls_certificates ( + server_name text, + fingerprint text, + from_server text, + ts_added_ms bigint, + tls_certificate bytea +); + + +-- +-- Name: state_events; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE state_events ( + event_id text NOT NULL, + room_id text NOT NULL, + type text NOT NULL, + state_key text NOT NULL, + prev_state text +); + + +-- +-- Name: state_forward_extremities; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE state_forward_extremities ( + event_id text NOT NULL, + room_id text NOT NULL, + type text NOT NULL, + state_key text NOT NULL +); + + +-- +-- Name: state_group_edges; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE state_group_edges ( + state_group bigint NOT NULL, + prev_state_group bigint NOT NULL +); + + +-- +-- Name: state_group_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE state_group_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: state_groups; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE state_groups ( + id bigint NOT NULL, + room_id text NOT NULL, + event_id text NOT NULL +); + + +-- +-- Name: state_groups_state; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE state_groups_state ( + state_group bigint NOT NULL, + room_id text NOT NULL, + type text NOT NULL, + state_key text NOT NULL, + event_id text NOT NULL +); + + +-- +-- Name: stats_reporting; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE stats_reporting ( + reported_stream_token integer, + reported_time bigint +); + + +-- +-- Name: stream_ordering_to_exterm; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE stream_ordering_to_exterm ( + stream_ordering bigint NOT NULL, + room_id text NOT NULL, + event_id text NOT NULL +); + + +-- +-- Name: threepid_guest_access_tokens; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE threepid_guest_access_tokens ( + medium text, + address text, + guest_access_token text, + first_inviter text +); + + +-- +-- Name: topics; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE topics ( + event_id text NOT NULL, + room_id text NOT NULL, + topic text NOT NULL +); + + +-- +-- Name: transaction_id_to_pdu; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE transaction_id_to_pdu ( + transaction_id integer, + destination text, + pdu_id text, + pdu_origin text +); + + +-- +-- Name: user_daily_visits; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE user_daily_visits ( + user_id text NOT NULL, + device_id text, + "timestamp" bigint NOT NULL +); + + +-- +-- Name: user_directory; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE user_directory ( + user_id text NOT NULL, + room_id text, + display_name text, + avatar_url text +); + + +-- +-- Name: user_directory_search; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE user_directory_search ( + user_id text NOT NULL, + vector tsvector +); + + +-- +-- Name: user_directory_stream_pos; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE user_directory_stream_pos ( + lock character(1) DEFAULT 'X'::bpchar NOT NULL, + stream_id bigint, + CONSTRAINT user_directory_stream_pos_lock_check CHECK ((lock = 'X'::bpchar)) +); + + +-- +-- Name: user_filters; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE user_filters ( + user_id text, + filter_id bigint, + filter_json bytea +); + + +-- +-- Name: user_ips; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE user_ips ( + user_id text NOT NULL, + access_token text NOT NULL, + device_id text, + ip text NOT NULL, + user_agent text NOT NULL, + last_seen bigint NOT NULL +); + + +-- +-- Name: user_threepids; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE user_threepids ( + user_id text NOT NULL, + medium text NOT NULL, + address text NOT NULL, + validated_at bigint NOT NULL, + added_at bigint NOT NULL +); + + +-- +-- Name: users; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE users ( + name text, + password_hash text, + creation_ts bigint, + admin smallint DEFAULT 0 NOT NULL, + upgrade_ts bigint, + is_guest smallint DEFAULT 0 NOT NULL, + appservice_id text, + consent_version text, + consent_server_notice_sent text, + user_type text +); + + +-- +-- Name: users_in_public_rooms; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE users_in_public_rooms ( + user_id text NOT NULL, + room_id text NOT NULL +); + + +-- +-- Name: users_pending_deactivation; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE users_pending_deactivation ( + user_id text NOT NULL +); + + +-- +-- Name: users_who_share_rooms; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE users_who_share_rooms ( + user_id text NOT NULL, + other_user_id text NOT NULL, + room_id text NOT NULL, + share_private boolean NOT NULL +); + + +-- +-- Name: access_tokens access_tokens_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY access_tokens + ADD CONSTRAINT access_tokens_pkey PRIMARY KEY (id); + + +-- +-- Name: access_tokens access_tokens_token_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY access_tokens + ADD CONSTRAINT access_tokens_token_key UNIQUE (token); + + +-- +-- Name: account_data account_data_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY account_data + ADD CONSTRAINT account_data_uniqueness UNIQUE (user_id, account_data_type); + + +-- +-- Name: application_services application_services_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY application_services + ADD CONSTRAINT application_services_pkey PRIMARY KEY (id); + + +-- +-- Name: application_services_regex application_services_regex_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY application_services_regex + ADD CONSTRAINT application_services_regex_pkey PRIMARY KEY (id); + + +-- +-- Name: application_services_state application_services_state_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY application_services_state + ADD CONSTRAINT application_services_state_pkey PRIMARY KEY (as_id); + + +-- +-- Name: application_services application_services_token_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY application_services + ADD CONSTRAINT application_services_token_key UNIQUE (token); + + +-- +-- Name: application_services_txns application_services_txns_as_id_txn_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY application_services_txns + ADD CONSTRAINT application_services_txns_as_id_txn_id_key UNIQUE (as_id, txn_id); + + +-- +-- Name: appservice_stream_position appservice_stream_position_lock_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY appservice_stream_position + ADD CONSTRAINT appservice_stream_position_lock_key UNIQUE (lock); + + +-- +-- Name: background_updates background_updates_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY background_updates + ADD CONSTRAINT background_updates_uniqueness UNIQUE (update_name); + + +-- +-- Name: current_state_events current_state_events_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY current_state_events + ADD CONSTRAINT current_state_events_event_id_key UNIQUE (event_id); + + +-- +-- Name: current_state_events current_state_events_room_id_type_state_key_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY current_state_events + ADD CONSTRAINT current_state_events_room_id_type_state_key_key UNIQUE (room_id, type, state_key); + + +-- +-- Name: current_state_resets current_state_resets_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY current_state_resets + ADD CONSTRAINT current_state_resets_pkey PRIMARY KEY (event_stream_ordering); + + +-- +-- Name: destinations destinations_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY destinations + ADD CONSTRAINT destinations_pkey PRIMARY KEY (destination); + + +-- +-- Name: devices device_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY devices + ADD CONSTRAINT device_uniqueness UNIQUE (user_id, device_id); + + +-- +-- Name: e2e_device_keys_json e2e_device_keys_json_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY e2e_device_keys_json + ADD CONSTRAINT e2e_device_keys_json_uniqueness UNIQUE (user_id, device_id); + + +-- +-- Name: e2e_one_time_keys_json e2e_one_time_keys_json_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY e2e_one_time_keys_json + ADD CONSTRAINT e2e_one_time_keys_json_uniqueness UNIQUE (user_id, device_id, algorithm, key_id); + + +-- +-- Name: event_backward_extremities event_backward_extremities_event_id_room_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY event_backward_extremities + ADD CONSTRAINT event_backward_extremities_event_id_room_id_key UNIQUE (event_id, room_id); + + +-- +-- Name: event_content_hashes event_content_hashes_event_id_algorithm_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY event_content_hashes + ADD CONSTRAINT event_content_hashes_event_id_algorithm_key UNIQUE (event_id, algorithm); + + +-- +-- Name: event_destinations event_destinations_event_id_destination_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY event_destinations + ADD CONSTRAINT event_destinations_event_id_destination_key UNIQUE (event_id, destination); + + +-- +-- Name: event_edge_hashes event_edge_hashes_event_id_prev_event_id_algorithm_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY event_edge_hashes + ADD CONSTRAINT event_edge_hashes_event_id_prev_event_id_algorithm_key UNIQUE (event_id, prev_event_id, algorithm); + + +-- +-- Name: event_edges event_edges_event_id_prev_event_id_room_id_is_state_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY event_edges + ADD CONSTRAINT event_edges_event_id_prev_event_id_room_id_is_state_key UNIQUE (event_id, prev_event_id, room_id, is_state); + + +-- +-- Name: event_forward_extremities event_forward_extremities_event_id_room_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY event_forward_extremities + ADD CONSTRAINT event_forward_extremities_event_id_room_id_key UNIQUE (event_id, room_id); + + +-- +-- Name: event_push_actions event_id_user_id_profile_tag_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY event_push_actions + ADD CONSTRAINT event_id_user_id_profile_tag_uniqueness UNIQUE (room_id, event_id, user_id, profile_tag); + + +-- +-- Name: event_json event_json_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY event_json + ADD CONSTRAINT event_json_event_id_key UNIQUE (event_id); + + +-- +-- Name: event_push_summary_stream_ordering event_push_summary_stream_ordering_lock_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY event_push_summary_stream_ordering + ADD CONSTRAINT event_push_summary_stream_ordering_lock_key UNIQUE (lock); + + +-- +-- Name: event_reference_hashes event_reference_hashes_event_id_algorithm_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY event_reference_hashes + ADD CONSTRAINT event_reference_hashes_event_id_algorithm_key UNIQUE (event_id, algorithm); + + +-- +-- Name: event_reports event_reports_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY event_reports + ADD CONSTRAINT event_reports_pkey PRIMARY KEY (id); + + +-- +-- Name: event_signatures event_signatures_event_id_signature_name_key_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY event_signatures + ADD CONSTRAINT event_signatures_event_id_signature_name_key_id_key UNIQUE (event_id, signature_name, key_id); + + +-- +-- Name: event_to_state_groups event_to_state_groups_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY event_to_state_groups + ADD CONSTRAINT event_to_state_groups_event_id_key UNIQUE (event_id); + + +-- +-- Name: events events_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY events + ADD CONSTRAINT events_event_id_key UNIQUE (event_id); + + +-- +-- Name: events events_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY events + ADD CONSTRAINT events_pkey PRIMARY KEY (stream_ordering); + + +-- +-- Name: ex_outlier_stream ex_outlier_stream_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY ex_outlier_stream + ADD CONSTRAINT ex_outlier_stream_pkey PRIMARY KEY (event_stream_ordering); + + +-- +-- Name: feedback feedback_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY feedback + ADD CONSTRAINT feedback_event_id_key UNIQUE (event_id); + + +-- +-- Name: group_roles group_roles_group_id_role_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY group_roles + ADD CONSTRAINT group_roles_group_id_role_id_key UNIQUE (group_id, role_id); + + +-- +-- Name: group_room_categories group_room_categories_group_id_category_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY group_room_categories + ADD CONSTRAINT group_room_categories_group_id_category_id_key UNIQUE (group_id, category_id); + + +-- +-- Name: group_summary_roles group_summary_roles_group_id_role_id_role_order_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY group_summary_roles + ADD CONSTRAINT group_summary_roles_group_id_role_id_role_order_key UNIQUE (group_id, role_id, role_order); + + +-- +-- Name: group_summary_room_categories group_summary_room_categories_group_id_category_id_cat_orde_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY group_summary_room_categories + ADD CONSTRAINT group_summary_room_categories_group_id_category_id_cat_orde_key UNIQUE (group_id, category_id, cat_order); + + +-- +-- Name: group_summary_rooms group_summary_rooms_group_id_category_id_room_id_room_order_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY group_summary_rooms + ADD CONSTRAINT group_summary_rooms_group_id_category_id_room_id_room_order_key UNIQUE (group_id, category_id, room_id, room_order); + + +-- +-- Name: guest_access guest_access_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY guest_access + ADD CONSTRAINT guest_access_event_id_key UNIQUE (event_id); + + +-- +-- Name: history_visibility history_visibility_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY history_visibility + ADD CONSTRAINT history_visibility_event_id_key UNIQUE (event_id); + + +-- +-- Name: local_media_repository local_media_repository_media_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY local_media_repository + ADD CONSTRAINT local_media_repository_media_id_key UNIQUE (media_id); + + +-- +-- Name: local_media_repository_thumbnails local_media_repository_thumbn_media_id_thumbnail_width_thum_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY local_media_repository_thumbnails + ADD CONSTRAINT local_media_repository_thumbn_media_id_thumbnail_width_thum_key UNIQUE (media_id, thumbnail_width, thumbnail_height, thumbnail_type); + + +-- +-- Name: user_threepids medium_address; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY user_threepids + ADD CONSTRAINT medium_address UNIQUE (medium, address); + + +-- +-- Name: open_id_tokens open_id_tokens_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY open_id_tokens + ADD CONSTRAINT open_id_tokens_pkey PRIMARY KEY (token); + + +-- +-- Name: presence_allow_inbound presence_allow_inbound_observed_user_id_observer_user_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY presence_allow_inbound + ADD CONSTRAINT presence_allow_inbound_observed_user_id_observer_user_id_key UNIQUE (observed_user_id, observer_user_id); + + +-- +-- Name: presence_list presence_list_user_id_observed_user_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY presence_list + ADD CONSTRAINT presence_list_user_id_observed_user_id_key UNIQUE (user_id, observed_user_id); + + +-- +-- Name: presence presence_user_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY presence + ADD CONSTRAINT presence_user_id_key UNIQUE (user_id); + + +-- +-- Name: account_data_max_stream_id private_user_data_max_stream_id_lock_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY account_data_max_stream_id + ADD CONSTRAINT private_user_data_max_stream_id_lock_key UNIQUE (lock); + + +-- +-- Name: profiles profiles_user_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY profiles + ADD CONSTRAINT profiles_user_id_key UNIQUE (user_id); + + +-- +-- Name: push_rules_enable push_rules_enable_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY push_rules_enable + ADD CONSTRAINT push_rules_enable_pkey PRIMARY KEY (id); + + +-- +-- Name: push_rules_enable push_rules_enable_user_name_rule_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY push_rules_enable + ADD CONSTRAINT push_rules_enable_user_name_rule_id_key UNIQUE (user_name, rule_id); + + +-- +-- Name: push_rules push_rules_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY push_rules + ADD CONSTRAINT push_rules_pkey PRIMARY KEY (id); + + +-- +-- Name: push_rules push_rules_user_name_rule_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY push_rules + ADD CONSTRAINT push_rules_user_name_rule_id_key UNIQUE (user_name, rule_id); + + +-- +-- Name: pusher_throttle pusher_throttle_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY pusher_throttle + ADD CONSTRAINT pusher_throttle_pkey PRIMARY KEY (pusher, room_id); + + +-- +-- Name: pushers pushers2_app_id_pushkey_user_name_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY pushers + ADD CONSTRAINT pushers2_app_id_pushkey_user_name_key UNIQUE (app_id, pushkey, user_name); + + +-- +-- Name: pushers pushers2_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY pushers + ADD CONSTRAINT pushers2_pkey PRIMARY KEY (id); + + +-- +-- Name: receipts_graph receipts_graph_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY receipts_graph + ADD CONSTRAINT receipts_graph_uniqueness UNIQUE (room_id, receipt_type, user_id); + + +-- +-- Name: receipts_linearized receipts_linearized_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY receipts_linearized + ADD CONSTRAINT receipts_linearized_uniqueness UNIQUE (room_id, receipt_type, user_id); + + +-- +-- Name: received_transactions received_transactions_transaction_id_origin_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY received_transactions + ADD CONSTRAINT received_transactions_transaction_id_origin_key UNIQUE (transaction_id, origin); + + +-- +-- Name: redactions redactions_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY redactions + ADD CONSTRAINT redactions_event_id_key UNIQUE (event_id); + + +-- +-- Name: rejections rejections_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY rejections + ADD CONSTRAINT rejections_event_id_key UNIQUE (event_id); + + +-- +-- Name: remote_media_cache remote_media_cache_media_origin_media_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY remote_media_cache + ADD CONSTRAINT remote_media_cache_media_origin_media_id_key UNIQUE (media_origin, media_id); + + +-- +-- Name: remote_media_cache_thumbnails remote_media_cache_thumbnails_media_origin_media_id_thumbna_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY remote_media_cache_thumbnails + ADD CONSTRAINT remote_media_cache_thumbnails_media_origin_media_id_thumbna_key UNIQUE (media_origin, media_id, thumbnail_width, thumbnail_height, thumbnail_type); + + +-- +-- Name: room_account_data room_account_data_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY room_account_data + ADD CONSTRAINT room_account_data_uniqueness UNIQUE (user_id, room_id, account_data_type); + + +-- +-- Name: room_aliases room_aliases_room_alias_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY room_aliases + ADD CONSTRAINT room_aliases_room_alias_key UNIQUE (room_alias); + + +-- +-- Name: room_depth room_depth_room_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY room_depth + ADD CONSTRAINT room_depth_room_id_key UNIQUE (room_id); + + +-- +-- Name: room_hosts room_hosts_room_id_host_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY room_hosts + ADD CONSTRAINT room_hosts_room_id_host_key UNIQUE (room_id, host); + + +-- +-- Name: room_memberships room_memberships_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY room_memberships + ADD CONSTRAINT room_memberships_event_id_key UNIQUE (event_id); + + +-- +-- Name: room_names room_names_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY room_names + ADD CONSTRAINT room_names_event_id_key UNIQUE (event_id); + + +-- +-- Name: room_tags_revisions room_tag_revisions_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY room_tags_revisions + ADD CONSTRAINT room_tag_revisions_uniqueness UNIQUE (user_id, room_id); + + +-- +-- Name: room_tags room_tag_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY room_tags + ADD CONSTRAINT room_tag_uniqueness UNIQUE (user_id, room_id, tag); + + +-- +-- Name: rooms rooms_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY rooms + ADD CONSTRAINT rooms_pkey PRIMARY KEY (room_id); + + +-- +-- Name: server_keys_json server_keys_json_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY server_keys_json + ADD CONSTRAINT server_keys_json_uniqueness UNIQUE (server_name, key_id, from_server); + + +-- +-- Name: server_signature_keys server_signature_keys_server_name_key_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY server_signature_keys + ADD CONSTRAINT server_signature_keys_server_name_key_id_key UNIQUE (server_name, key_id); + + +-- +-- Name: server_tls_certificates server_tls_certificates_server_name_fingerprint_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY server_tls_certificates + ADD CONSTRAINT server_tls_certificates_server_name_fingerprint_key UNIQUE (server_name, fingerprint); + + +-- +-- Name: state_events state_events_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY state_events + ADD CONSTRAINT state_events_event_id_key UNIQUE (event_id); + + +-- +-- Name: state_forward_extremities state_forward_extremities_event_id_room_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY state_forward_extremities + ADD CONSTRAINT state_forward_extremities_event_id_room_id_key UNIQUE (event_id, room_id); + + +-- +-- Name: state_groups state_groups_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY state_groups + ADD CONSTRAINT state_groups_pkey PRIMARY KEY (id); + + +-- +-- Name: topics topics_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY topics + ADD CONSTRAINT topics_event_id_key UNIQUE (event_id); + + +-- +-- Name: transaction_id_to_pdu transaction_id_to_pdu_transaction_id_destination_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY transaction_id_to_pdu + ADD CONSTRAINT transaction_id_to_pdu_transaction_id_destination_key UNIQUE (transaction_id, destination); + + +-- +-- Name: user_directory_stream_pos user_directory_stream_pos_lock_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY user_directory_stream_pos + ADD CONSTRAINT user_directory_stream_pos_lock_key UNIQUE (lock); + + +-- +-- Name: users users_name_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY users + ADD CONSTRAINT users_name_key UNIQUE (name); + + +-- +-- Name: access_tokens_device_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX access_tokens_device_id ON access_tokens USING btree (user_id, device_id); + + +-- +-- Name: account_data_stream_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX account_data_stream_id ON account_data USING btree (user_id, stream_id); + + +-- +-- Name: application_services_txns_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX application_services_txns_id ON application_services_txns USING btree (as_id); + + +-- +-- Name: appservice_room_list_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX appservice_room_list_idx ON appservice_room_list USING btree (appservice_id, network_id, room_id); + + +-- +-- Name: blocked_rooms_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX blocked_rooms_idx ON blocked_rooms USING btree (room_id); + + +-- +-- Name: cache_invalidation_stream_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX cache_invalidation_stream_id ON cache_invalidation_stream USING btree (stream_id); + + +-- +-- Name: current_state_delta_stream_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX current_state_delta_stream_idx ON current_state_delta_stream USING btree (stream_id); + + +-- +-- Name: current_state_events_member_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX current_state_events_member_index ON current_state_events USING btree (state_key) WHERE (type = 'm.room.member'::text); + + +-- +-- Name: deleted_pushers_stream_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX deleted_pushers_stream_id ON deleted_pushers USING btree (stream_id); + + +-- +-- Name: device_federation_inbox_sender_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX device_federation_inbox_sender_id ON device_federation_inbox USING btree (origin, message_id); + + +-- +-- Name: device_federation_outbox_destination_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX device_federation_outbox_destination_id ON device_federation_outbox USING btree (destination, stream_id); + + +-- +-- Name: device_federation_outbox_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX device_federation_outbox_id ON device_federation_outbox USING btree (stream_id); + + +-- +-- Name: device_inbox_stream_id_user_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX device_inbox_stream_id_user_id ON device_inbox USING btree (stream_id, user_id); + + +-- +-- Name: device_inbox_user_stream_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX device_inbox_user_stream_id ON device_inbox USING btree (user_id, device_id, stream_id); + + +-- +-- Name: device_lists_outbound_last_success_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX device_lists_outbound_last_success_idx ON device_lists_outbound_last_success USING btree (destination, user_id, stream_id); + + +-- +-- Name: device_lists_outbound_pokes_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX device_lists_outbound_pokes_id ON device_lists_outbound_pokes USING btree (destination, stream_id); + + +-- +-- Name: device_lists_outbound_pokes_stream; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX device_lists_outbound_pokes_stream ON device_lists_outbound_pokes USING btree (stream_id); + + +-- +-- Name: device_lists_outbound_pokes_user; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX device_lists_outbound_pokes_user ON device_lists_outbound_pokes USING btree (destination, user_id); + + +-- +-- Name: device_lists_remote_cache_unique_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX device_lists_remote_cache_unique_id ON device_lists_remote_cache USING btree (user_id, device_id); + + +-- +-- Name: device_lists_remote_extremeties_unique_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX device_lists_remote_extremeties_unique_idx ON device_lists_remote_extremeties USING btree (user_id); + + +-- +-- Name: device_lists_stream_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX device_lists_stream_id ON device_lists_stream USING btree (stream_id, user_id); + + +-- +-- Name: device_lists_stream_user_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX device_lists_stream_user_id ON device_lists_stream USING btree (user_id, device_id); + + +-- +-- Name: e2e_room_keys_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX e2e_room_keys_idx ON e2e_room_keys USING btree (user_id, room_id, session_id); + + +-- +-- Name: e2e_room_keys_versions_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX e2e_room_keys_versions_idx ON e2e_room_keys_versions USING btree (user_id, version); + + +-- +-- Name: erased_users_user; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX erased_users_user ON erased_users USING btree (user_id); + + +-- +-- Name: ev_b_extrem_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX ev_b_extrem_id ON event_backward_extremities USING btree (event_id); + + +-- +-- Name: ev_b_extrem_room; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX ev_b_extrem_room ON event_backward_extremities USING btree (room_id); + + +-- +-- Name: ev_edges_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX ev_edges_id ON event_edges USING btree (event_id); + + +-- +-- Name: ev_edges_prev_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX ev_edges_prev_id ON event_edges USING btree (prev_event_id); + + +-- +-- Name: ev_extrem_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX ev_extrem_id ON event_forward_extremities USING btree (event_id); + + +-- +-- Name: ev_extrem_room; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX ev_extrem_room ON event_forward_extremities USING btree (room_id); + + +-- +-- Name: evauth_edges_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX evauth_edges_id ON event_auth USING btree (event_id); + + +-- +-- Name: event_contains_url_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX event_contains_url_index ON events USING btree (room_id, topological_ordering, stream_ordering) WHERE ((contains_url = true) AND (outlier = false)); + + +-- +-- Name: event_json_room_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX event_json_room_id ON event_json USING btree (room_id); + + +-- +-- Name: event_push_actions_highlights_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX event_push_actions_highlights_index ON event_push_actions USING btree (user_id, room_id, topological_ordering, stream_ordering) WHERE (highlight = 1); + + +-- +-- Name: event_push_actions_rm_tokens; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX event_push_actions_rm_tokens ON event_push_actions USING btree (user_id, room_id, topological_ordering, stream_ordering); + + +-- +-- Name: event_push_actions_room_id_user_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX event_push_actions_room_id_user_id ON event_push_actions USING btree (room_id, user_id); + + +-- +-- Name: event_push_actions_staging_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX event_push_actions_staging_id ON event_push_actions_staging USING btree (event_id); + + +-- +-- Name: event_push_actions_stream_ordering; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX event_push_actions_stream_ordering ON event_push_actions USING btree (stream_ordering, user_id); + + +-- +-- Name: event_push_actions_u_highlight; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX event_push_actions_u_highlight ON event_push_actions USING btree (user_id, stream_ordering); + + +-- +-- Name: event_push_summary_user_rm; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX event_push_summary_user_rm ON event_push_summary USING btree (user_id, room_id); + + +-- +-- Name: event_reference_hashes_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX event_reference_hashes_id ON event_reference_hashes USING btree (event_id); + + +-- +-- Name: event_search_ev_ridx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX event_search_ev_ridx ON event_search USING btree (room_id); + + +-- +-- Name: event_search_event_id_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX event_search_event_id_idx ON event_search USING btree (event_id); + + +-- +-- Name: event_search_fts_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX event_search_fts_idx ON event_search USING gin (vector); + + +-- +-- Name: event_to_state_groups_sg_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX event_to_state_groups_sg_index ON event_to_state_groups USING btree (state_group); + + +-- +-- Name: events_order_room; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX events_order_room ON events USING btree (room_id, topological_ordering, stream_ordering); + + +-- +-- Name: events_room_stream; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX events_room_stream ON events USING btree (room_id, stream_ordering); + + +-- +-- Name: events_ts; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX events_ts ON events USING btree (origin_server_ts, stream_ordering); + + +-- +-- Name: group_attestations_remote_g_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX group_attestations_remote_g_idx ON group_attestations_remote USING btree (group_id, user_id); + + +-- +-- Name: group_attestations_remote_u_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX group_attestations_remote_u_idx ON group_attestations_remote USING btree (user_id); + + +-- +-- Name: group_attestations_remote_v_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX group_attestations_remote_v_idx ON group_attestations_remote USING btree (valid_until_ms); + + +-- +-- Name: group_attestations_renewals_g_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX group_attestations_renewals_g_idx ON group_attestations_renewals USING btree (group_id, user_id); + + +-- +-- Name: group_attestations_renewals_u_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX group_attestations_renewals_u_idx ON group_attestations_renewals USING btree (user_id); + + +-- +-- Name: group_attestations_renewals_v_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX group_attestations_renewals_v_idx ON group_attestations_renewals USING btree (valid_until_ms); + + +-- +-- Name: group_invites_g_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX group_invites_g_idx ON group_invites USING btree (group_id, user_id); + + +-- +-- Name: group_invites_u_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX group_invites_u_idx ON group_invites USING btree (user_id); + + +-- +-- Name: group_rooms_g_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX group_rooms_g_idx ON group_rooms USING btree (group_id, room_id); + + +-- +-- Name: group_rooms_r_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX group_rooms_r_idx ON group_rooms USING btree (room_id); + + +-- +-- Name: group_summary_rooms_g_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX group_summary_rooms_g_idx ON group_summary_rooms USING btree (group_id, room_id, category_id); + + +-- +-- Name: group_summary_users_g_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX group_summary_users_g_idx ON group_summary_users USING btree (group_id); + + +-- +-- Name: group_users_g_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX group_users_g_idx ON group_users USING btree (group_id, user_id); + + +-- +-- Name: group_users_u_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX group_users_u_idx ON group_users USING btree (user_id); + + +-- +-- Name: groups_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX groups_idx ON groups USING btree (group_id); + + +-- +-- Name: local_group_membership_g_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX local_group_membership_g_idx ON local_group_membership USING btree (group_id); + + +-- +-- Name: local_group_membership_u_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX local_group_membership_u_idx ON local_group_membership USING btree (user_id, group_id); + + +-- +-- Name: local_invites_for_user_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX local_invites_for_user_idx ON local_invites USING btree (invitee, locally_rejected, replaced_by, room_id); + + +-- +-- Name: local_invites_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX local_invites_id ON local_invites USING btree (stream_id); + + +-- +-- Name: local_media_repository_thumbnails_media_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX local_media_repository_thumbnails_media_id ON local_media_repository_thumbnails USING btree (media_id); + + +-- +-- Name: local_media_repository_url_cache_by_url_download_ts; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX local_media_repository_url_cache_by_url_download_ts ON local_media_repository_url_cache USING btree (url, download_ts); + + +-- +-- Name: local_media_repository_url_cache_expires_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX local_media_repository_url_cache_expires_idx ON local_media_repository_url_cache USING btree (expires_ts); + + +-- +-- Name: local_media_repository_url_cache_media_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX local_media_repository_url_cache_media_idx ON local_media_repository_url_cache USING btree (media_id); + + +-- +-- Name: local_media_repository_url_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX local_media_repository_url_idx ON local_media_repository USING btree (created_ts) WHERE (url_cache IS NOT NULL); + + +-- +-- Name: monthly_active_users_time_stamp; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX monthly_active_users_time_stamp ON monthly_active_users USING btree ("timestamp"); + + +-- +-- Name: monthly_active_users_users; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX monthly_active_users_users ON monthly_active_users USING btree (user_id); + + +-- +-- Name: open_id_tokens_ts_valid_until_ms; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX open_id_tokens_ts_valid_until_ms ON open_id_tokens USING btree (ts_valid_until_ms); + + +-- +-- Name: presence_list_user_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX presence_list_user_id ON presence_list USING btree (user_id); + + +-- +-- Name: presence_stream_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX presence_stream_id ON presence_stream USING btree (stream_id, user_id); + + +-- +-- Name: presence_stream_user_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX presence_stream_user_id ON presence_stream USING btree (user_id); + + +-- +-- Name: public_room_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX public_room_index ON rooms USING btree (is_public); + + +-- +-- Name: public_room_list_stream_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX public_room_list_stream_idx ON public_room_list_stream USING btree (stream_id); + + +-- +-- Name: public_room_list_stream_rm_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX public_room_list_stream_rm_idx ON public_room_list_stream USING btree (room_id, stream_id); + + +-- +-- Name: push_rules_enable_user_name; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX push_rules_enable_user_name ON push_rules_enable USING btree (user_name); + + +-- +-- Name: push_rules_stream_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX push_rules_stream_id ON push_rules_stream USING btree (stream_id); + + +-- +-- Name: push_rules_stream_user_stream_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX push_rules_stream_user_stream_id ON push_rules_stream USING btree (user_id, stream_id); + + +-- +-- Name: push_rules_user_name; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX push_rules_user_name ON push_rules USING btree (user_name); + + +-- +-- Name: ratelimit_override_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX ratelimit_override_idx ON ratelimit_override USING btree (user_id); + + +-- +-- Name: receipts_linearized_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX receipts_linearized_id ON receipts_linearized USING btree (stream_id); + + +-- +-- Name: receipts_linearized_room_stream; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX receipts_linearized_room_stream ON receipts_linearized USING btree (room_id, stream_id); + + +-- +-- Name: receipts_linearized_user; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX receipts_linearized_user ON receipts_linearized USING btree (user_id); + + +-- +-- Name: received_transactions_ts; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX received_transactions_ts ON received_transactions USING btree (ts); + + +-- +-- Name: redactions_redacts; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX redactions_redacts ON redactions USING btree (redacts); + + +-- +-- Name: remote_profile_cache_time; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX remote_profile_cache_time ON remote_profile_cache USING btree (last_check); + + +-- +-- Name: remote_profile_cache_user_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX remote_profile_cache_user_id ON remote_profile_cache USING btree (user_id); + + +-- +-- Name: room_account_data_stream_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX room_account_data_stream_id ON room_account_data USING btree (user_id, stream_id); + + +-- +-- Name: room_alias_servers_alias; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX room_alias_servers_alias ON room_alias_servers USING btree (room_alias); + + +-- +-- Name: room_aliases_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX room_aliases_id ON room_aliases USING btree (room_id); + + +-- +-- Name: room_depth_room; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX room_depth_room ON room_depth USING btree (room_id); + + +-- +-- Name: room_memberships_room_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX room_memberships_room_id ON room_memberships USING btree (room_id); + + +-- +-- Name: room_memberships_user_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX room_memberships_user_id ON room_memberships USING btree (user_id); + + +-- +-- Name: room_names_room_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX room_names_room_id ON room_names USING btree (room_id); + + +-- +-- Name: st_extrem_keys; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX st_extrem_keys ON state_forward_extremities USING btree (room_id, type, state_key); + + +-- +-- Name: state_group_edges_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX state_group_edges_idx ON state_group_edges USING btree (state_group); + + +-- +-- Name: state_group_edges_prev_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX state_group_edges_prev_idx ON state_group_edges USING btree (prev_state_group); + + +-- +-- Name: state_groups_state_type_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX state_groups_state_type_idx ON state_groups_state USING btree (state_group, type, state_key); + + +-- +-- Name: stream_ordering_to_exterm_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX stream_ordering_to_exterm_idx ON stream_ordering_to_exterm USING btree (stream_ordering); + + +-- +-- Name: stream_ordering_to_exterm_rm_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX stream_ordering_to_exterm_rm_idx ON stream_ordering_to_exterm USING btree (room_id, stream_ordering); + + +-- +-- Name: threepid_guest_access_tokens_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX threepid_guest_access_tokens_index ON threepid_guest_access_tokens USING btree (medium, address); + + +-- +-- Name: topics_room_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX topics_room_id ON topics USING btree (room_id); + + +-- +-- Name: transaction_id_to_pdu_dest; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX transaction_id_to_pdu_dest ON transaction_id_to_pdu USING btree (destination); + + +-- +-- Name: user_daily_visits_ts_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX user_daily_visits_ts_idx ON user_daily_visits USING btree ("timestamp"); + + +-- +-- Name: user_daily_visits_uts_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX user_daily_visits_uts_idx ON user_daily_visits USING btree (user_id, "timestamp"); + + +-- +-- Name: user_directory_room_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX user_directory_room_idx ON user_directory USING btree (room_id); + + +-- +-- Name: user_directory_search_fts_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX user_directory_search_fts_idx ON user_directory_search USING gin (vector); + + +-- +-- Name: user_directory_search_user_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX user_directory_search_user_idx ON user_directory_search USING btree (user_id); + + +-- +-- Name: user_directory_user_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX user_directory_user_idx ON user_directory USING btree (user_id); + + +-- +-- Name: user_filters_by_user_id_filter_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX user_filters_by_user_id_filter_id ON user_filters USING btree (user_id, filter_id); + + +-- +-- Name: user_ips_device_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX user_ips_device_id ON user_ips USING btree (user_id, device_id, last_seen); + + +-- +-- Name: user_ips_device_unique_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX user_ips_device_unique_id ON user_ips USING btree (user_id, access_token, ip, user_agent, device_id); + + +-- +-- Name: user_ips_last_seen; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX user_ips_last_seen ON user_ips USING btree (user_id, last_seen); + + +-- +-- Name: user_ips_last_seen_only; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX user_ips_last_seen_only ON user_ips USING btree (last_seen); + + +-- +-- Name: user_ips_user_ip; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX user_ips_user_ip ON user_ips USING btree (user_id, access_token, ip); + + +-- +-- Name: user_threepids_medium_address; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX user_threepids_medium_address ON user_threepids USING btree (medium, address); + + +-- +-- Name: user_threepids_user_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX user_threepids_user_id ON user_threepids USING btree (user_id); + + +-- +-- Name: users_creation_ts; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX users_creation_ts ON users USING btree (creation_ts); + + +-- +-- Name: users_in_public_rooms_room_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX users_in_public_rooms_room_idx ON users_in_public_rooms USING btree (room_id); + + +-- +-- Name: users_in_public_rooms_user_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX users_in_public_rooms_user_idx ON users_in_public_rooms USING btree (user_id); + + +-- +-- Name: users_who_share_rooms_o_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX users_who_share_rooms_o_idx ON users_who_share_rooms USING btree (other_user_id); + + +-- +-- Name: users_who_share_rooms_r_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX users_who_share_rooms_r_idx ON users_who_share_rooms USING btree (room_id); + + +-- +-- Name: users_who_share_rooms_u_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX users_who_share_rooms_u_idx ON users_who_share_rooms USING btree (user_id, other_user_id); + + +-- +-- Name: application_services_regex application_services_regex_as_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY application_services_regex + ADD CONSTRAINT application_services_regex_as_id_fkey FOREIGN KEY (as_id) REFERENCES application_services(id); + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/synapse/storage/schema/full_schemas/54/full.sql.sqlite b/synapse/storage/schema/full_schemas/54/full.sql.sqlite new file mode 100644 index 000000000000..60b8c6fe7629 --- /dev/null +++ b/synapse/storage/schema/full_schemas/54/full.sql.sqlite @@ -0,0 +1,1203 @@ +CREATE TABLE application_services( + id BIGINT PRIMARY KEY, + url TEXT, + token TEXT, + hs_token TEXT, + sender TEXT, + UNIQUE(token) +); +CREATE TABLE application_services_regex( + id BIGINT PRIMARY KEY, + as_id BIGINT NOT NULL, + namespace INTEGER, + regex TEXT, + FOREIGN KEY(as_id) REFERENCES application_services(id) +); +CREATE TABLE application_services_state( + as_id TEXT PRIMARY KEY, + state VARCHAR(5), + last_txn INTEGER +); +CREATE TABLE application_services_txns( + as_id TEXT NOT NULL, + txn_id INTEGER NOT NULL, + event_ids TEXT NOT NULL, + UNIQUE(as_id, txn_id) +); +CREATE INDEX application_services_txns_id ON application_services_txns(as_id); +CREATE TABLE presence( + user_id TEXT NOT NULL, + state VARCHAR(20), + status_msg TEXT, + mtime BIGINT, + UNIQUE(user_id) +); +CREATE TABLE presence_allow_inbound( + observed_user_id TEXT NOT NULL, + observer_user_id TEXT NOT NULL, + UNIQUE(observed_user_id, observer_user_id) +); +CREATE TABLE presence_list( + user_id TEXT NOT NULL, + observed_user_id TEXT NOT NULL, + accepted BOOLEAN NOT NULL, + UNIQUE(user_id, observed_user_id) +); +CREATE INDEX presence_list_user_id ON presence_list(user_id); +CREATE TABLE users( + name TEXT, + password_hash TEXT, + creation_ts BIGINT, + admin SMALLINT DEFAULT 0 NOT NULL, + upgrade_ts BIGINT, + is_guest SMALLINT DEFAULT 0 NOT NULL, + appservice_id TEXT, + consent_version TEXT, + consent_server_notice_sent TEXT, + user_type TEXT DEFAULT NULL, + UNIQUE(name) +); +CREATE TABLE access_tokens( + id BIGINT PRIMARY KEY, + user_id TEXT NOT NULL, + device_id TEXT, + token TEXT NOT NULL, + last_used BIGINT, + UNIQUE(token) +); +CREATE TABLE user_ips( + user_id TEXT NOT NULL, + access_token TEXT NOT NULL, + device_id TEXT, + ip TEXT NOT NULL, + user_agent TEXT NOT NULL, + last_seen BIGINT NOT NULL +); +CREATE INDEX user_ips_user_ip ON user_ips(user_id, access_token, ip); +CREATE TABLE profiles( + user_id TEXT NOT NULL, + displayname TEXT, + avatar_url TEXT, + UNIQUE(user_id) +); +CREATE TABLE received_transactions( + transaction_id TEXT, + origin TEXT, + ts BIGINT, + response_code INTEGER, + response_json bytea, + has_been_referenced smallint default 0, + UNIQUE(transaction_id, origin) +); +CREATE TABLE transaction_id_to_pdu( + transaction_id INTEGER, + destination TEXT, + pdu_id TEXT, + pdu_origin TEXT, + UNIQUE(transaction_id, destination) +); +CREATE INDEX transaction_id_to_pdu_dest ON transaction_id_to_pdu(destination); +CREATE TABLE destinations( + destination TEXT PRIMARY KEY, + retry_last_ts BIGINT, + retry_interval INTEGER +); +CREATE TABLE events( + stream_ordering INTEGER PRIMARY KEY, + topological_ordering BIGINT NOT NULL, + event_id TEXT NOT NULL, + type TEXT NOT NULL, + room_id TEXT NOT NULL, + content TEXT, + unrecognized_keys TEXT, + processed BOOL NOT NULL, + outlier BOOL NOT NULL, + depth BIGINT DEFAULT 0 NOT NULL, + origin_server_ts BIGINT, + received_ts BIGINT, + sender TEXT, + contains_url BOOLEAN, + UNIQUE(event_id) +); +CREATE INDEX events_order_room ON events( + room_id, + topological_ordering, + stream_ordering +); +CREATE TABLE event_json( + event_id TEXT NOT NULL, + room_id TEXT NOT NULL, + internal_metadata TEXT NOT NULL, + json TEXT NOT NULL, + UNIQUE(event_id) +); +CREATE INDEX event_json_room_id ON event_json(room_id); +CREATE TABLE state_events( + event_id TEXT NOT NULL, + room_id TEXT NOT NULL, + type TEXT NOT NULL, + state_key TEXT NOT NULL, + prev_state TEXT, + UNIQUE(event_id) +); +CREATE TABLE current_state_events( + event_id TEXT NOT NULL, + room_id TEXT NOT NULL, + type TEXT NOT NULL, + state_key TEXT NOT NULL, + UNIQUE(event_id), + UNIQUE(room_id, type, state_key) +); +CREATE TABLE room_memberships( + event_id TEXT NOT NULL, + user_id TEXT NOT NULL, + sender TEXT NOT NULL, + room_id TEXT NOT NULL, + membership TEXT NOT NULL, + forgotten INTEGER DEFAULT 0, + display_name TEXT, + avatar_url TEXT, + UNIQUE(event_id) +); +CREATE INDEX room_memberships_room_id ON room_memberships(room_id); +CREATE INDEX room_memberships_user_id ON room_memberships(user_id); +CREATE TABLE feedback( + event_id TEXT NOT NULL, + feedback_type TEXT, + target_event_id TEXT, + sender TEXT, + room_id TEXT, + UNIQUE(event_id) +); +CREATE TABLE topics( + event_id TEXT NOT NULL, + room_id TEXT NOT NULL, + topic TEXT NOT NULL, + UNIQUE(event_id) +); +CREATE INDEX topics_room_id ON topics(room_id); +CREATE TABLE room_names( + event_id TEXT NOT NULL, + room_id TEXT NOT NULL, + name TEXT NOT NULL, + UNIQUE(event_id) +); +CREATE INDEX room_names_room_id ON room_names(room_id); +CREATE TABLE rooms( + room_id TEXT PRIMARY KEY NOT NULL, + is_public BOOL, + creator TEXT +); +CREATE TABLE room_hosts( + room_id TEXT NOT NULL, + host TEXT NOT NULL, + UNIQUE(room_id, host) +); +CREATE TABLE server_tls_certificates( + server_name TEXT, + fingerprint TEXT, + from_server TEXT, + ts_added_ms BIGINT, + tls_certificate bytea, + UNIQUE(server_name, fingerprint) +); +CREATE TABLE server_signature_keys( + server_name TEXT, + key_id TEXT, + from_server TEXT, + ts_added_ms BIGINT, + verify_key bytea, + UNIQUE(server_name, key_id) +); +CREATE TABLE rejections( + event_id TEXT NOT NULL, + reason TEXT NOT NULL, + last_check TEXT NOT NULL, + UNIQUE(event_id) +); +CREATE TABLE push_rules( + id BIGINT PRIMARY KEY, + user_name TEXT NOT NULL, + rule_id TEXT NOT NULL, + priority_class SMALLINT NOT NULL, + priority INTEGER NOT NULL DEFAULT 0, + conditions TEXT NOT NULL, + actions TEXT NOT NULL, + UNIQUE(user_name, rule_id) +); +CREATE INDEX push_rules_user_name on push_rules(user_name); +CREATE TABLE user_filters(user_id TEXT, filter_id BIGINT, filter_json bytea); +CREATE INDEX user_filters_by_user_id_filter_id ON user_filters( + user_id, + filter_id +); +CREATE TABLE push_rules_enable( + id BIGINT PRIMARY KEY, + user_name TEXT NOT NULL, + rule_id TEXT NOT NULL, + enabled SMALLINT, + UNIQUE(user_name, rule_id) +); +CREATE INDEX push_rules_enable_user_name on push_rules_enable(user_name); +CREATE TABLE event_forward_extremities( + event_id TEXT NOT NULL, + room_id TEXT NOT NULL, + UNIQUE(event_id, room_id) +); +CREATE INDEX ev_extrem_room ON event_forward_extremities(room_id); +CREATE INDEX ev_extrem_id ON event_forward_extremities(event_id); +CREATE TABLE event_backward_extremities( + event_id TEXT NOT NULL, + room_id TEXT NOT NULL, + UNIQUE(event_id, room_id) +); +CREATE INDEX ev_b_extrem_room ON event_backward_extremities(room_id); +CREATE INDEX ev_b_extrem_id ON event_backward_extremities(event_id); +CREATE TABLE event_edges( + event_id TEXT NOT NULL, + prev_event_id TEXT NOT NULL, + room_id TEXT NOT NULL, + is_state BOOL NOT NULL, + UNIQUE(event_id, prev_event_id, room_id, is_state) +); +CREATE INDEX ev_edges_id ON event_edges(event_id); +CREATE INDEX ev_edges_prev_id ON event_edges(prev_event_id); +CREATE TABLE room_depth( + room_id TEXT NOT NULL, + min_depth INTEGER NOT NULL, + UNIQUE(room_id) +); +CREATE INDEX room_depth_room ON room_depth(room_id); +CREATE TABLE event_destinations( + event_id TEXT NOT NULL, + destination TEXT NOT NULL, + delivered_ts BIGINT DEFAULT 0, + UNIQUE(event_id, destination) +); +CREATE TABLE state_forward_extremities( + event_id TEXT NOT NULL, + room_id TEXT NOT NULL, + type TEXT NOT NULL, + state_key TEXT NOT NULL, + UNIQUE(event_id, room_id) +); +CREATE INDEX st_extrem_keys ON state_forward_extremities( + room_id, + type, + state_key +); +CREATE TABLE state_groups( + id BIGINT PRIMARY KEY, + room_id TEXT NOT NULL, + event_id TEXT NOT NULL +); +CREATE TABLE state_groups_state( + state_group BIGINT NOT NULL, + room_id TEXT NOT NULL, + type TEXT NOT NULL, + state_key TEXT NOT NULL, + event_id TEXT NOT NULL +); +CREATE TABLE event_to_state_groups( + event_id TEXT NOT NULL, + state_group BIGINT NOT NULL, + UNIQUE(event_id) +); +CREATE TABLE local_media_repository( + media_id TEXT, + media_type TEXT, + media_length INTEGER, + created_ts BIGINT, + upload_name TEXT, + user_id TEXT, + quarantined_by TEXT, + url_cache TEXT, + last_access_ts BIGINT, + UNIQUE(media_id) +); +CREATE TABLE local_media_repository_thumbnails( + media_id TEXT, + thumbnail_width INTEGER, + thumbnail_height INTEGER, + thumbnail_type TEXT, + thumbnail_method TEXT, + thumbnail_length INTEGER, + UNIQUE(media_id, thumbnail_width, thumbnail_height, thumbnail_type) +); +CREATE INDEX local_media_repository_thumbnails_media_id ON local_media_repository_thumbnails( + media_id +); +CREATE TABLE remote_media_cache( + media_origin TEXT, + media_id TEXT, + media_type TEXT, + created_ts BIGINT, + upload_name TEXT, + media_length INTEGER, + filesystem_id TEXT, + last_access_ts BIGINT, + quarantined_by TEXT, + UNIQUE(media_origin, media_id) +); +CREATE TABLE remote_media_cache_thumbnails( + media_origin TEXT, + media_id TEXT, + thumbnail_width INTEGER, + thumbnail_height INTEGER, + thumbnail_method TEXT, + thumbnail_type TEXT, + thumbnail_length INTEGER, + filesystem_id TEXT, + UNIQUE(media_origin, media_id, thumbnail_width, thumbnail_height, thumbnail_type) +); +CREATE TABLE redactions( + event_id TEXT NOT NULL, + redacts TEXT NOT NULL, + UNIQUE(event_id) +); +CREATE INDEX redactions_redacts ON redactions(redacts); +CREATE TABLE room_aliases( + room_alias TEXT NOT NULL, + room_id TEXT NOT NULL, + creator TEXT, + UNIQUE(room_alias) +); +CREATE INDEX room_aliases_id ON room_aliases(room_id); +CREATE TABLE room_alias_servers( + room_alias TEXT NOT NULL, + server TEXT NOT NULL +); +CREATE INDEX room_alias_servers_alias ON room_alias_servers(room_alias); +CREATE TABLE event_content_hashes( + event_id TEXT, + algorithm TEXT, + hash bytea, + UNIQUE(event_id, algorithm) +); +CREATE TABLE event_reference_hashes( + event_id TEXT, + algorithm TEXT, + hash bytea, + UNIQUE(event_id, algorithm) +); +CREATE INDEX event_reference_hashes_id ON event_reference_hashes(event_id); +CREATE TABLE event_signatures( + event_id TEXT, + signature_name TEXT, + key_id TEXT, + signature bytea, + UNIQUE(event_id, signature_name, key_id) +); +CREATE TABLE event_edge_hashes( + event_id TEXT, + prev_event_id TEXT, + algorithm TEXT, + hash bytea, + UNIQUE(event_id, prev_event_id, algorithm) +); +CREATE TABLE IF NOT EXISTS "server_keys_json"( + server_name TEXT NOT NULL, + key_id TEXT NOT NULL, + from_server TEXT NOT NULL, + ts_added_ms BIGINT NOT NULL, + ts_valid_until_ms BIGINT NOT NULL, + key_json bytea NOT NULL, + CONSTRAINT server_keys_json_uniqueness UNIQUE(server_name, key_id, from_server) +); +CREATE TABLE e2e_device_keys_json( + user_id TEXT NOT NULL, + device_id TEXT NOT NULL, + ts_added_ms BIGINT NOT NULL, + key_json TEXT NOT NULL, + CONSTRAINT e2e_device_keys_json_uniqueness UNIQUE(user_id, device_id) +); +CREATE TABLE e2e_one_time_keys_json( + user_id TEXT NOT NULL, + device_id TEXT NOT NULL, + algorithm TEXT NOT NULL, + key_id TEXT NOT NULL, + ts_added_ms BIGINT NOT NULL, + key_json TEXT NOT NULL, + CONSTRAINT e2e_one_time_keys_json_uniqueness UNIQUE(user_id, device_id, algorithm, key_id) +); +CREATE TABLE receipts_graph( + room_id TEXT NOT NULL, + receipt_type TEXT NOT NULL, + user_id TEXT NOT NULL, + event_ids TEXT NOT NULL, + data TEXT NOT NULL, + CONSTRAINT receipts_graph_uniqueness UNIQUE(room_id, receipt_type, user_id) +); +CREATE TABLE receipts_linearized( + stream_id BIGINT NOT NULL, + room_id TEXT NOT NULL, + receipt_type TEXT NOT NULL, + user_id TEXT NOT NULL, + event_id TEXT NOT NULL, + data TEXT NOT NULL, + CONSTRAINT receipts_linearized_uniqueness UNIQUE(room_id, receipt_type, user_id) +); +CREATE INDEX receipts_linearized_id ON receipts_linearized(stream_id); +CREATE INDEX receipts_linearized_room_stream ON receipts_linearized( + room_id, + stream_id +); +CREATE TABLE IF NOT EXISTS "user_threepids"( + user_id TEXT NOT NULL, + medium TEXT NOT NULL, + address TEXT NOT NULL, + validated_at BIGINT NOT NULL, + added_at BIGINT NOT NULL, + CONSTRAINT medium_address UNIQUE(medium, address) +); +CREATE INDEX user_threepids_user_id ON user_threepids(user_id); +CREATE TABLE stats_reporting( + reported_stream_token INTEGER, + reported_time BIGINT +); +CREATE TABLE background_updates( + update_name TEXT NOT NULL, + progress_json TEXT NOT NULL, + depends_on TEXT, + CONSTRAINT background_updates_uniqueness UNIQUE(update_name) +); +CREATE VIRTUAL TABLE event_search USING fts4( + event_id, + room_id, + sender, + key, + value +) +/* event_search( + event_id, + room_id, + sender, + "key", + value +) */; +CREATE TABLE IF NOT EXISTS 'event_search_content'( + docid INTEGER PRIMARY KEY, + 'c0event_id', + 'c1room_id', + 'c2sender', + 'c3key', + 'c4value' +); +CREATE TABLE IF NOT EXISTS 'event_search_segments'(blockid INTEGER PRIMARY KEY, block BLOB); +CREATE TABLE IF NOT EXISTS 'event_search_segdir'( + level INTEGER, + idx INTEGER, + start_block INTEGER, + leaves_end_block INTEGER, + end_block INTEGER, + root BLOB, + PRIMARY KEY(level, idx) +); +CREATE TABLE IF NOT EXISTS 'event_search_docsize'(docid INTEGER PRIMARY KEY, size BLOB); +CREATE TABLE IF NOT EXISTS 'event_search_stat'(id INTEGER PRIMARY KEY, value BLOB); +CREATE TABLE guest_access( + event_id TEXT NOT NULL, + room_id TEXT NOT NULL, + guest_access TEXT NOT NULL, + UNIQUE(event_id) +); +CREATE TABLE history_visibility( + event_id TEXT NOT NULL, + room_id TEXT NOT NULL, + history_visibility TEXT NOT NULL, + UNIQUE(event_id) +); +CREATE TABLE room_tags( + user_id TEXT NOT NULL, + room_id TEXT NOT NULL, + tag TEXT NOT NULL, + content TEXT NOT NULL, + CONSTRAINT room_tag_uniqueness UNIQUE(user_id, room_id, tag) +); +CREATE TABLE room_tags_revisions( + user_id TEXT NOT NULL, + room_id TEXT NOT NULL, + stream_id BIGINT NOT NULL, + CONSTRAINT room_tag_revisions_uniqueness UNIQUE(user_id, room_id) +); +CREATE TABLE IF NOT EXISTS "account_data_max_stream_id"( + Lock CHAR(1) NOT NULL DEFAULT 'X' UNIQUE, + stream_id BIGINT NOT NULL, + CHECK(Lock='X') +); +CREATE TABLE account_data( + user_id TEXT NOT NULL, + account_data_type TEXT NOT NULL, + stream_id BIGINT NOT NULL, + content TEXT NOT NULL, + CONSTRAINT account_data_uniqueness UNIQUE(user_id, account_data_type) +); +CREATE TABLE room_account_data( + user_id TEXT NOT NULL, + room_id TEXT NOT NULL, + account_data_type TEXT NOT NULL, + stream_id BIGINT NOT NULL, + content TEXT NOT NULL, + CONSTRAINT room_account_data_uniqueness UNIQUE(user_id, room_id, account_data_type) +); +CREATE INDEX account_data_stream_id on account_data(user_id, stream_id); +CREATE INDEX room_account_data_stream_id on room_account_data( + user_id, + stream_id +); +CREATE INDEX events_ts ON events(origin_server_ts, stream_ordering); +CREATE TABLE event_push_actions( + room_id TEXT NOT NULL, + event_id TEXT NOT NULL, + user_id TEXT NOT NULL, + profile_tag VARCHAR(32), + actions TEXT NOT NULL, + topological_ordering BIGINT, + stream_ordering BIGINT, + notif SMALLINT, + highlight SMALLINT, + CONSTRAINT event_id_user_id_profile_tag_uniqueness UNIQUE(room_id, event_id, user_id, profile_tag) +); +CREATE INDEX event_push_actions_room_id_user_id on event_push_actions( + room_id, + user_id +); +CREATE INDEX events_room_stream on events(room_id, stream_ordering); +CREATE INDEX public_room_index on rooms(is_public); +CREATE INDEX receipts_linearized_user ON receipts_linearized(user_id); +CREATE INDEX event_push_actions_rm_tokens on event_push_actions( + user_id, + room_id, + topological_ordering, + stream_ordering +); +CREATE TABLE presence_stream( + stream_id BIGINT, + user_id TEXT, + state TEXT, + last_active_ts BIGINT, + last_federation_update_ts BIGINT, + last_user_sync_ts BIGINT, + status_msg TEXT, + currently_active BOOLEAN +); +CREATE INDEX presence_stream_id ON presence_stream(stream_id, user_id); +CREATE INDEX presence_stream_user_id ON presence_stream(user_id); +CREATE TABLE push_rules_stream( + stream_id BIGINT NOT NULL, + event_stream_ordering BIGINT NOT NULL, + user_id TEXT NOT NULL, + rule_id TEXT NOT NULL, + op TEXT NOT NULL, + priority_class SMALLINT, + priority INTEGER, + conditions TEXT, + actions TEXT +); +CREATE INDEX push_rules_stream_id ON push_rules_stream(stream_id); +CREATE INDEX push_rules_stream_user_stream_id on push_rules_stream( + user_id, + stream_id +); +CREATE TABLE current_state_resets( + event_stream_ordering BIGINT PRIMARY KEY NOT NULL +); +CREATE TABLE ex_outlier_stream( + event_stream_ordering BIGINT PRIMARY KEY NOT NULL, + event_id TEXT NOT NULL, + state_group BIGINT NOT NULL +); +CREATE TABLE threepid_guest_access_tokens( + medium TEXT, + address TEXT, + guest_access_token TEXT, + first_inviter TEXT +); +CREATE UNIQUE INDEX threepid_guest_access_tokens_index ON threepid_guest_access_tokens( + medium, + address +); +CREATE TABLE local_invites( + stream_id BIGINT NOT NULL, + inviter TEXT NOT NULL, + invitee TEXT NOT NULL, + event_id TEXT NOT NULL, + room_id TEXT NOT NULL, + locally_rejected TEXT, + replaced_by TEXT +); +CREATE INDEX local_invites_id ON local_invites(stream_id); +CREATE INDEX local_invites_for_user_idx ON local_invites( + invitee, + locally_rejected, + replaced_by, + room_id +); +CREATE INDEX event_push_actions_stream_ordering on event_push_actions( + stream_ordering, + user_id +); +CREATE TABLE open_id_tokens( + token TEXT NOT NULL PRIMARY KEY, + ts_valid_until_ms bigint NOT NULL, + user_id TEXT NOT NULL, + UNIQUE(token) +); +CREATE INDEX open_id_tokens_ts_valid_until_ms ON open_id_tokens( + ts_valid_until_ms +); +CREATE TABLE pusher_throttle( + pusher BIGINT NOT NULL, + room_id TEXT NOT NULL, + last_sent_ts BIGINT, + throttle_ms BIGINT, + PRIMARY KEY(pusher, room_id) +); +CREATE TABLE event_reports( + id BIGINT NOT NULL PRIMARY KEY, + received_ts BIGINT NOT NULL, + room_id TEXT NOT NULL, + event_id TEXT NOT NULL, + user_id TEXT NOT NULL, + reason TEXT, + content TEXT +); +CREATE TABLE devices( + user_id TEXT NOT NULL, + device_id TEXT NOT NULL, + display_name TEXT, + CONSTRAINT device_uniqueness UNIQUE(user_id, device_id) +); +CREATE TABLE appservice_stream_position( + Lock CHAR(1) NOT NULL DEFAULT 'X' UNIQUE, + stream_ordering BIGINT, + CHECK(Lock='X') +); +CREATE TABLE device_inbox( + user_id TEXT NOT NULL, + device_id TEXT NOT NULL, + stream_id BIGINT NOT NULL, + message_json TEXT NOT NULL +); +CREATE INDEX device_inbox_user_stream_id ON device_inbox( + user_id, + device_id, + stream_id +); +CREATE INDEX received_transactions_ts ON received_transactions(ts); +CREATE TABLE device_federation_outbox( + destination TEXT NOT NULL, + stream_id BIGINT NOT NULL, + queued_ts BIGINT NOT NULL, + messages_json TEXT NOT NULL +); +CREATE INDEX device_federation_outbox_destination_id ON device_federation_outbox( + destination, + stream_id +); +CREATE TABLE device_federation_inbox( + origin TEXT NOT NULL, + message_id TEXT NOT NULL, + received_ts BIGINT NOT NULL +); +CREATE INDEX device_federation_inbox_sender_id ON device_federation_inbox( + origin, + message_id +); +CREATE TABLE device_max_stream_id(stream_id BIGINT NOT NULL); +CREATE TABLE public_room_list_stream( + stream_id BIGINT NOT NULL, + room_id TEXT NOT NULL, + visibility BOOLEAN NOT NULL , + appservice_id TEXT, + network_id TEXT +); +CREATE INDEX public_room_list_stream_idx on public_room_list_stream(stream_id); +CREATE INDEX public_room_list_stream_rm_idx on public_room_list_stream( + room_id, + stream_id +); +CREATE TABLE state_group_edges( + state_group BIGINT NOT NULL, + prev_state_group BIGINT NOT NULL +); +CREATE INDEX state_group_edges_idx ON state_group_edges(state_group); +CREATE INDEX state_group_edges_prev_idx ON state_group_edges(prev_state_group); +CREATE TABLE stream_ordering_to_exterm( + stream_ordering BIGINT NOT NULL, + room_id TEXT NOT NULL, + event_id TEXT NOT NULL +); +CREATE INDEX stream_ordering_to_exterm_idx on stream_ordering_to_exterm( + stream_ordering +); +CREATE INDEX stream_ordering_to_exterm_rm_idx on stream_ordering_to_exterm( + room_id, + stream_ordering +); +CREATE TABLE IF NOT EXISTS "event_auth"( + event_id TEXT NOT NULL, + auth_id TEXT NOT NULL, + room_id TEXT NOT NULL +); +CREATE INDEX evauth_edges_id ON event_auth(event_id); +CREATE INDEX user_threepids_medium_address on user_threepids(medium, address); +CREATE TABLE appservice_room_list( + appservice_id TEXT NOT NULL, + network_id TEXT NOT NULL, + room_id TEXT NOT NULL +); +CREATE UNIQUE INDEX appservice_room_list_idx ON appservice_room_list( + appservice_id, + network_id, + room_id +); +CREATE INDEX device_federation_outbox_id ON device_federation_outbox( + stream_id +); +CREATE TABLE federation_stream_position( + type TEXT NOT NULL, + stream_id INTEGER NOT NULL +); +CREATE TABLE device_lists_remote_cache( + user_id TEXT NOT NULL, + device_id TEXT NOT NULL, + content TEXT NOT NULL +); +CREATE TABLE device_lists_remote_extremeties( + user_id TEXT NOT NULL, + stream_id TEXT NOT NULL +); +CREATE TABLE device_lists_stream( + stream_id BIGINT NOT NULL, + user_id TEXT NOT NULL, + device_id TEXT NOT NULL +); +CREATE INDEX device_lists_stream_id ON device_lists_stream(stream_id, user_id); +CREATE TABLE device_lists_outbound_pokes( + destination TEXT NOT NULL, + stream_id BIGINT NOT NULL, + user_id TEXT NOT NULL, + device_id TEXT NOT NULL, + sent BOOLEAN NOT NULL, + ts BIGINT NOT NULL +); +CREATE INDEX device_lists_outbound_pokes_id ON device_lists_outbound_pokes( + destination, + stream_id +); +CREATE INDEX device_lists_outbound_pokes_user ON device_lists_outbound_pokes( + destination, + user_id +); +CREATE TABLE event_push_summary( + user_id TEXT NOT NULL, + room_id TEXT NOT NULL, + notif_count BIGINT NOT NULL, + stream_ordering BIGINT NOT NULL +); +CREATE INDEX event_push_summary_user_rm ON event_push_summary( + user_id, + room_id +); +CREATE TABLE event_push_summary_stream_ordering( + Lock CHAR(1) NOT NULL DEFAULT 'X' UNIQUE, + stream_ordering BIGINT NOT NULL, + CHECK(Lock='X') +); +CREATE TABLE IF NOT EXISTS "pushers"( + id BIGINT PRIMARY KEY, + user_name TEXT NOT NULL, + access_token BIGINT DEFAULT NULL, + profile_tag TEXT NOT NULL, + kind TEXT NOT NULL, + app_id TEXT NOT NULL, + app_display_name TEXT NOT NULL, + device_display_name TEXT NOT NULL, + pushkey TEXT NOT NULL, + ts BIGINT NOT NULL, + lang TEXT, + data TEXT, + last_stream_ordering INTEGER, + last_success BIGINT, + failing_since BIGINT, + UNIQUE(app_id, pushkey, user_name) +); +CREATE INDEX device_lists_outbound_pokes_stream ON device_lists_outbound_pokes( + stream_id +); +CREATE TABLE ratelimit_override( + user_id TEXT NOT NULL, + messages_per_second BIGINT, + burst_count BIGINT +); +CREATE UNIQUE INDEX ratelimit_override_idx ON ratelimit_override(user_id); +CREATE TABLE current_state_delta_stream( + stream_id BIGINT NOT NULL, + room_id TEXT NOT NULL, + type TEXT NOT NULL, + state_key TEXT NOT NULL, + event_id TEXT, + prev_event_id TEXT +); +CREATE INDEX current_state_delta_stream_idx ON current_state_delta_stream( + stream_id +); +CREATE TABLE device_lists_outbound_last_success( + destination TEXT NOT NULL, + user_id TEXT NOT NULL, + stream_id BIGINT NOT NULL +); +CREATE INDEX device_lists_outbound_last_success_idx ON device_lists_outbound_last_success( + destination, + user_id, + stream_id +); +CREATE TABLE user_directory_stream_pos( + Lock CHAR(1) NOT NULL DEFAULT 'X' UNIQUE, + stream_id BIGINT, + CHECK(Lock='X') +); +CREATE TABLE IF NOT EXISTS "users_in_public_rooms"( + user_id TEXT NOT NULL, + room_id TEXT NOT NULL +); +CREATE VIRTUAL TABLE user_directory_search USING fts4( + user_id, + value +) +/* user_directory_search( + user_id, + value +) */; +CREATE TABLE IF NOT EXISTS 'user_directory_search_content'( + docid INTEGER PRIMARY KEY, + 'c0user_id', + 'c1value' +); +CREATE TABLE IF NOT EXISTS 'user_directory_search_segments'( + blockid INTEGER PRIMARY KEY, + block BLOB +); +CREATE TABLE IF NOT EXISTS 'user_directory_search_segdir'( + level INTEGER, + idx INTEGER, + start_block INTEGER, + leaves_end_block INTEGER, + end_block INTEGER, + root BLOB, + PRIMARY KEY(level, idx) +); +CREATE TABLE IF NOT EXISTS 'user_directory_search_docsize'( + docid INTEGER PRIMARY KEY, + size BLOB +); +CREATE TABLE IF NOT EXISTS 'user_directory_search_stat'(id INTEGER PRIMARY KEY, value BLOB); +CREATE TABLE blocked_rooms(room_id TEXT NOT NULL, user_id TEXT NOT NULL); +CREATE UNIQUE INDEX blocked_rooms_idx ON blocked_rooms(room_id); +CREATE TABLE users_who_share_rooms( + user_id TEXT NOT NULL, + other_user_id TEXT NOT NULL, + room_id TEXT NOT NULL, + share_private BOOLEAN NOT NULL +); +CREATE UNIQUE INDEX users_who_share_rooms_u_idx ON users_who_share_rooms( + user_id, + other_user_id +); +CREATE INDEX users_who_share_rooms_r_idx ON users_who_share_rooms(room_id); +CREATE INDEX users_who_share_rooms_o_idx ON users_who_share_rooms( + other_user_id +); +CREATE TABLE IF NOT EXISTS "local_media_repository_url_cache"( + url TEXT, + response_code INTEGER, + etag TEXT, + expires_ts BIGINT, + og TEXT, + media_id TEXT, + download_ts BIGINT +); +CREATE INDEX local_media_repository_url_cache_expires_idx ON local_media_repository_url_cache( + expires_ts +); +CREATE INDEX local_media_repository_url_cache_by_url_download_ts ON local_media_repository_url_cache( + url, + download_ts +); +CREATE INDEX local_media_repository_url_cache_media_idx ON local_media_repository_url_cache( + media_id +); +CREATE TABLE group_users( + group_id TEXT NOT NULL, + user_id TEXT NOT NULL, + is_admin BOOLEAN NOT NULL, + is_public BOOLEAN NOT NULL +); +CREATE TABLE group_invites(group_id TEXT NOT NULL, user_id TEXT NOT NULL); +CREATE TABLE group_rooms( + group_id TEXT NOT NULL, + room_id TEXT NOT NULL, + is_public BOOLEAN NOT NULL +); +CREATE TABLE group_summary_rooms( + group_id TEXT NOT NULL, + room_id TEXT NOT NULL, + category_id TEXT NOT NULL, + room_order BIGINT NOT NULL, + is_public BOOLEAN NOT NULL, + UNIQUE(group_id, category_id, room_id, room_order), + CHECK(room_order > 0) +); +CREATE UNIQUE INDEX group_summary_rooms_g_idx ON group_summary_rooms( + group_id, + room_id, + category_id +); +CREATE TABLE group_summary_room_categories( + group_id TEXT NOT NULL, + category_id TEXT NOT NULL, + cat_order BIGINT NOT NULL, + UNIQUE(group_id, category_id, cat_order), + CHECK(cat_order > 0) +); +CREATE TABLE group_room_categories( + group_id TEXT NOT NULL, + category_id TEXT NOT NULL, + profile TEXT NOT NULL, + is_public BOOLEAN NOT NULL, + UNIQUE(group_id, category_id) +); +CREATE TABLE group_summary_users( + group_id TEXT NOT NULL, + user_id TEXT NOT NULL, + role_id TEXT NOT NULL, + user_order BIGINT NOT NULL, + is_public BOOLEAN NOT NULL +); +CREATE INDEX group_summary_users_g_idx ON group_summary_users(group_id); +CREATE TABLE group_summary_roles( + group_id TEXT NOT NULL, + role_id TEXT NOT NULL, + role_order BIGINT NOT NULL, + UNIQUE(group_id, role_id, role_order), + CHECK(role_order > 0) +); +CREATE TABLE group_roles( + group_id TEXT NOT NULL, + role_id TEXT NOT NULL, + profile TEXT NOT NULL, + is_public BOOLEAN NOT NULL, + UNIQUE(group_id, role_id) +); +CREATE TABLE group_attestations_renewals( + group_id TEXT NOT NULL, + user_id TEXT NOT NULL, + valid_until_ms BIGINT NOT NULL +); +CREATE INDEX group_attestations_renewals_g_idx ON group_attestations_renewals( + group_id, + user_id +); +CREATE INDEX group_attestations_renewals_u_idx ON group_attestations_renewals( + user_id +); +CREATE INDEX group_attestations_renewals_v_idx ON group_attestations_renewals( + valid_until_ms +); +CREATE TABLE group_attestations_remote( + group_id TEXT NOT NULL, + user_id TEXT NOT NULL, + valid_until_ms BIGINT NOT NULL, + attestation_json TEXT NOT NULL +); +CREATE INDEX group_attestations_remote_g_idx ON group_attestations_remote( + group_id, + user_id +); +CREATE INDEX group_attestations_remote_u_idx ON group_attestations_remote( + user_id +); +CREATE INDEX group_attestations_remote_v_idx ON group_attestations_remote( + valid_until_ms +); +CREATE TABLE local_group_membership( + group_id TEXT NOT NULL, + user_id TEXT NOT NULL, + is_admin BOOLEAN NOT NULL, + membership TEXT NOT NULL, + is_publicised BOOLEAN NOT NULL, + content TEXT NOT NULL +); +CREATE INDEX local_group_membership_u_idx ON local_group_membership( + user_id, + group_id +); +CREATE INDEX local_group_membership_g_idx ON local_group_membership(group_id); +CREATE TABLE local_group_updates( + stream_id BIGINT NOT NULL, + group_id TEXT NOT NULL, + user_id TEXT NOT NULL, + type TEXT NOT NULL, + content TEXT NOT NULL +); +CREATE TABLE remote_profile_cache( + user_id TEXT NOT NULL, + displayname TEXT, + avatar_url TEXT, + last_check BIGINT NOT NULL +); +CREATE UNIQUE INDEX remote_profile_cache_user_id ON remote_profile_cache( + user_id +); +CREATE INDEX remote_profile_cache_time ON remote_profile_cache(last_check); +CREATE TABLE IF NOT EXISTS "deleted_pushers"( + stream_id BIGINT NOT NULL, + app_id TEXT NOT NULL, + pushkey TEXT NOT NULL, + user_id TEXT NOT NULL +); +CREATE INDEX deleted_pushers_stream_id ON deleted_pushers(stream_id); +CREATE TABLE IF NOT EXISTS "groups"( + group_id TEXT NOT NULL, + name TEXT, + avatar_url TEXT, + short_description TEXT, + long_description TEXT, + is_public BOOL NOT NULL , + join_policy TEXT NOT NULL DEFAULT 'invite' +); +CREATE UNIQUE INDEX groups_idx ON groups(group_id); +CREATE TABLE IF NOT EXISTS "user_directory"( + user_id TEXT NOT NULL, + room_id TEXT, + display_name TEXT, + avatar_url TEXT +); +CREATE INDEX user_directory_room_idx ON user_directory(room_id); +CREATE UNIQUE INDEX user_directory_user_idx ON user_directory(user_id); +CREATE INDEX users_in_public_rooms_room_idx ON users_in_public_rooms(room_id); +CREATE UNIQUE INDEX users_in_public_rooms_user_idx ON users_in_public_rooms( + user_id +); +CREATE TABLE event_push_actions_staging( + event_id TEXT NOT NULL, + user_id TEXT NOT NULL, + actions TEXT NOT NULL, + notif SMALLINT NOT NULL, + highlight SMALLINT NOT NULL +); +CREATE INDEX event_push_actions_staging_id ON event_push_actions_staging( + event_id +); +CREATE TABLE users_pending_deactivation(user_id TEXT NOT NULL); +CREATE UNIQUE INDEX group_invites_g_idx ON group_invites(group_id, user_id); +CREATE UNIQUE INDEX group_users_g_idx ON group_users(group_id, user_id); +CREATE INDEX group_users_u_idx ON group_users(user_id); +CREATE INDEX group_invites_u_idx ON group_invites(user_id); +CREATE UNIQUE INDEX group_rooms_g_idx ON group_rooms(group_id, room_id); +CREATE INDEX group_rooms_r_idx ON group_rooms(room_id); +CREATE TABLE user_daily_visits( + user_id TEXT NOT NULL, + device_id TEXT, + timestamp BIGINT NOT NULL +); +CREATE INDEX user_daily_visits_uts_idx ON user_daily_visits( + user_id, + timestamp +); +CREATE INDEX user_daily_visits_ts_idx ON user_daily_visits(timestamp); +CREATE TABLE erased_users(user_id TEXT NOT NULL); +CREATE UNIQUE INDEX erased_users_user ON erased_users(user_id); +CREATE TABLE monthly_active_users( + user_id TEXT NOT NULL, + timestamp BIGINT NOT NULL +); +CREATE UNIQUE INDEX monthly_active_users_users ON monthly_active_users( + user_id +); +CREATE INDEX monthly_active_users_time_stamp ON monthly_active_users( + timestamp +); +CREATE TABLE IF NOT EXISTS "e2e_room_keys_versions"( + user_id TEXT NOT NULL, + version BIGINT NOT NULL, + algorithm TEXT NOT NULL, + auth_data TEXT NOT NULL, + deleted SMALLINT DEFAULT 0 NOT NULL +); +CREATE UNIQUE INDEX e2e_room_keys_versions_idx ON e2e_room_keys_versions( + user_id, + version +); +CREATE TABLE IF NOT EXISTS "e2e_room_keys"( + user_id TEXT NOT NULL, + room_id TEXT NOT NULL, + session_id TEXT NOT NULL, + version BIGINT NOT NULL, + first_message_index INT, + forwarded_count INT, + is_verified BOOLEAN, + session_data TEXT NOT NULL +); +CREATE UNIQUE INDEX e2e_room_keys_idx ON e2e_room_keys( + user_id, + room_id, + session_id +); +CREATE INDEX access_tokens_device_id ON access_tokens(user_id, device_id); +CREATE INDEX user_ips_device_id ON user_ips(user_id, device_id, last_seen); +CREATE INDEX event_contains_url_index ON events( + room_id, + topological_ordering, + stream_ordering +); +CREATE INDEX event_push_actions_u_highlight ON event_push_actions( + user_id, + stream_ordering +); +CREATE INDEX event_push_actions_highlights_index ON event_push_actions( + user_id, + room_id, + topological_ordering, + stream_ordering +); +CREATE INDEX current_state_events_member_index ON current_state_events( + state_key +); +CREATE INDEX device_inbox_stream_id_user_id ON device_inbox( + stream_id, + user_id +); +CREATE INDEX device_lists_stream_user_id ON device_lists_stream( + user_id, + device_id +); +CREATE INDEX local_media_repository_url_idx ON local_media_repository( + created_ts +); +CREATE INDEX user_ips_last_seen ON user_ips(user_id, last_seen); +CREATE INDEX user_ips_last_seen_only ON user_ips(last_seen); +CREATE INDEX users_creation_ts ON users(creation_ts); +CREATE INDEX event_to_state_groups_sg_index ON event_to_state_groups( + state_group +); +CREATE UNIQUE INDEX device_lists_remote_cache_unique_id ON device_lists_remote_cache( + user_id, + device_id +); +CREATE UNIQUE INDEX user_ips_device_unique_id ON user_ips( + user_id, + access_token, + ip, + user_agent, + device_id +); +CREATE INDEX state_groups_state_type_idx ON state_groups_state( + state_group, + type, + state_key +); +CREATE UNIQUE INDEX device_lists_remote_extremeties_unique_idx ON device_lists_remote_extremeties( + user_id +); diff --git a/synapse/storage/schema/full_schemas/54/zzz-inserts.sql b/synapse/storage/schema/full_schemas/54/zzz-inserts.sql new file mode 100644 index 000000000000..859691b0fb75 --- /dev/null +++ b/synapse/storage/schema/full_schemas/54/zzz-inserts.sql @@ -0,0 +1,12 @@ +INSERT INTO user_directory_stream_pos (stream_id) VALUES (null); + +INSERT INTO appservice_stream_position (stream_ordering) + SELECT COALESCE(MAX(stream_ordering), 0) FROM events; + +INSERT INTO device_max_stream_id (stream_id) + SELECT COALESCE(MAX(stream_id), 0) FROM device_inbox; + +INSERT INTO event_push_summary_stream_ordering (stream_ordering) VALUES (0); + +INSERT INTO federation_stream_position (type, stream_id) VALUES ('federation', -1); +INSERT INTO federation_stream_position (type, stream_id) SELECT 'events', coalesce(max(stream_ordering), -1) FROM events; diff --git a/synapse/storage/schema/full_schemas/README.md b/synapse/storage/schema/full_schemas/README.md new file mode 100644 index 000000000000..a4ad0c149492 --- /dev/null +++ b/synapse/storage/schema/full_schemas/README.md @@ -0,0 +1,16 @@ +Building full schema dumps +========================== + +Postgres +-------- + +$ pg_dump --schema-only --no-comments --no-tablespaces --no-acl --no-owner ${DATABASE_NAME} > full.sql.postgres + +In the resulting file, delete all SET commands from the top of the file. + +SQLite +------ + +$ sqlite3 $DATABASE_FILE ".schema" > full.sql.sqlite + +Delete the CREATE statements for "schema_version", "applied_schema_deltas", and "applied_module_schemas". \ No newline at end of file From 19c7149519f8c822cf1109e15498f7a7d212abb0 Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Fri, 4 Jan 2019 07:21:28 +1100 Subject: [PATCH 02/20] changelog --- changelog.d/4348.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/4348.feature diff --git a/changelog.d/4348.feature b/changelog.d/4348.feature new file mode 100644 index 000000000000..b297277ee26f --- /dev/null +++ b/changelog.d/4348.feature @@ -0,0 +1 @@ +Apply a unique index to the user_ips table. _This will require you to remove duplicate entries from the table, see the upgrade notes for details_. From ef82fe3b36c45cbfef0b783b2151b187236caca9 Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Fri, 4 Jan 2019 07:24:52 +1100 Subject: [PATCH 03/20] add the migration --- synapse/storage/client_ips.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/synapse/storage/client_ips.py b/synapse/storage/client_ips.py index 9ad17b7c2597..1c3aa4bff271 100644 --- a/synapse/storage/client_ips.py +++ b/synapse/storage/client_ips.py @@ -65,6 +65,15 @@ def __init__(self, db_conn, hs): columns=["last_seen"], ) + # Register a unique index + self.register_background_index_update( + "user_ips_device_unique_index", + index_name="user_ips_device_unique_id", + table="user_ips", + columns=["user_id", "access_token", "ip", "user_agent", "device_id"], + unique=True, + ) + # (user_id, access_token, ip) -> (user_agent, device_id, last_seen) self._batch_row_update = {} From 7b7f59377cb712ef9c541f10a7cda6e687277edd Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Wed, 9 Jan 2019 03:34:34 +1100 Subject: [PATCH 04/20] cleanup on the db inserts --- changelog.d/4348.feature | 2 +- synapse/storage/schema/full_schemas/54/zzz-inserts.sql | 8 +++----- synapse/storage/schema/full_schemas/README.md | 7 ++++++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/changelog.d/4348.feature b/changelog.d/4348.feature index b297277ee26f..047061ed3c71 100644 --- a/changelog.d/4348.feature +++ b/changelog.d/4348.feature @@ -1 +1 @@ -Apply a unique index to the user_ips table. _This will require you to remove duplicate entries from the table, see the upgrade notes for details_. +Apply a unique index to the user_ips table, preventing duplicates. diff --git a/synapse/storage/schema/full_schemas/54/zzz-inserts.sql b/synapse/storage/schema/full_schemas/54/zzz-inserts.sql index 859691b0fb75..df77458cb72a 100644 --- a/synapse/storage/schema/full_schemas/54/zzz-inserts.sql +++ b/synapse/storage/schema/full_schemas/54/zzz-inserts.sql @@ -1,12 +1,10 @@ INSERT INTO user_directory_stream_pos (stream_id) VALUES (null); -INSERT INTO appservice_stream_position (stream_ordering) - SELECT COALESCE(MAX(stream_ordering), 0) FROM events; +INSERT INTO appservice_stream_position (stream_ordering) VALUES (0); -INSERT INTO device_max_stream_id (stream_id) - SELECT COALESCE(MAX(stream_id), 0) FROM device_inbox; +INSERT INTO device_max_stream_id (stream_id) VALUES (0); INSERT INTO event_push_summary_stream_ordering (stream_ordering) VALUES (0); INSERT INTO federation_stream_position (type, stream_id) VALUES ('federation', -1); -INSERT INTO federation_stream_position (type, stream_id) SELECT 'events', coalesce(max(stream_ordering), -1) FROM events; +INSERT INTO federation_stream_position (type, stream_id) VALUES ('events', -1); diff --git a/synapse/storage/schema/full_schemas/README.md b/synapse/storage/schema/full_schemas/README.md index a4ad0c149492..615d5d73327e 100644 --- a/synapse/storage/schema/full_schemas/README.md +++ b/synapse/storage/schema/full_schemas/README.md @@ -13,4 +13,9 @@ SQLite $ sqlite3 $DATABASE_FILE ".schema" > full.sql.sqlite -Delete the CREATE statements for "schema_version", "applied_schema_deltas", and "applied_module_schemas". \ No newline at end of file +Delete the CREATE statements for "schema_version", "applied_schema_deltas", and "applied_module_schemas". + +Adding Empty Values To Tables +----------------------------- + +Some tables need data added, like stream ID tables. This is done in 54/zzz-inserts.sql and should be copied to any subsequent full schemas. \ No newline at end of file From 0844516d43de50afe373a161cad58e068b78af8e Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Wed, 9 Jan 2019 08:44:51 +1100 Subject: [PATCH 05/20] stuff --- synapse/storage/client_ips.py | 67 +++++++++++++++++-- .../delta/{54 => 53}/user_ips_index.sql | 8 ++- .../schema/full_schemas/54/full.sql.postgres | 2 +- .../schema/full_schemas/54/full.sql.sqlite | 4 +- tests/storage/test_client_ips.py | 22 ++++++ 5 files changed, 90 insertions(+), 13 deletions(-) rename synapse/storage/schema/delta/{54 => 53}/user_ips_index.sql (77%) diff --git a/synapse/storage/client_ips.py b/synapse/storage/client_ips.py index 1c3aa4bff271..8cf6e0d400b8 100644 --- a/synapse/storage/client_ips.py +++ b/synapse/storage/client_ips.py @@ -65,16 +65,21 @@ def __init__(self, db_conn, hs): columns=["last_seen"], ) + self.register_background_update_handler( + "user_ips_remove_dupes", + self._remove_user_ip_dupes, + ) + # Register a unique index self.register_background_index_update( "user_ips_device_unique_index", index_name="user_ips_device_unique_id", table="user_ips", - columns=["user_id", "access_token", "ip", "user_agent", "device_id"], + columns=["access_token", "ip", "user_agent"], unique=True, ) - # (user_id, access_token, ip) -> (user_agent, device_id, last_seen) + # (access_token, ip, user_agent) -> (user_id, device_id, last_seen) self._batch_row_update = {} self._client_ip_looper = self._clock.looping_call( @@ -84,12 +89,60 @@ def __init__(self, db_conn, hs): "before", "shutdown", self._update_client_ips_batch ) + @defer.inlineCallbacks + def _remove_user_ip_dupes(self, progress, batch_size): + yield self._remove_user_ip_dupes_impl() + yield self._end_background_update("user_ips_remove_dupes") + defer.returnValue(1) + + @defer.inlineCallbacks + def _remove_user_ip_dupes_impl(self): + + def get_users(txn): + txn.execute("SELECT DISTINCT user_id FROM user_ips;") + results = txn.fetchall() + return results + + users = yield self.runInteraction("user_ips_dups_get_users", get_users) + + def _clean(txn, user_id): + + txn.execute( + ( + "SELECT access_token, ip, user_agent, last_seen " + "FROM user_ips WHERE user_id = ?" + ), + (user_id,) + ) + results = txn.fetchall() + + seen_before = set() + duplicates = [] + + for i in results: + key = i[0:3] + if key not in seen_before: + seen_before.add(key) + else: + duplicates.append(i) + + for d in duplicates: + txn.execute("DELETE FROM user_ips WHERE access_token = ? AND ip = ? AND user_agent = ? AND last_seen = ?", d) + + print(duplicates) + + + + for user in users: + yield self.runInteraction("user_ips_clean", _clean, user[0]) + + @defer.inlineCallbacks def insert_client_ip(self, user_id, access_token, ip, user_agent, device_id, now=None): if not now: now = int(self._clock.time_msec()) - key = (user_id, access_token, ip) + key = (access_token, ip, user_agent) try: last_seen = self.client_ip_last_seen.get(key) @@ -102,7 +155,7 @@ def insert_client_ip(self, user_id, access_token, ip, user_agent, device_id, self.client_ip_last_seen.prefill(key, now) - self._batch_row_update[key] = (user_agent, device_id, now) + self._batch_row_update[key] = (user_id, device_id, now) def _update_client_ips_batch(self): @@ -126,20 +179,20 @@ def _update_client_ips_batch_txn(self, txn, to_update): self.database_engine.lock_table(txn, "user_ips") for entry in iteritems(to_update): - (user_id, access_token, ip), (user_agent, device_id, last_seen) = entry + (access_token, ip, user_agent), (user_id, device_id, last_seen) = entry try: self._simple_upsert_txn( txn, table="user_ips", keyvalues={ - "user_id": user_id, "access_token": access_token, "ip": ip, "user_agent": user_agent, - "device_id": device_id, }, values={ + "user_id": user_id, + "device_id": device_id, "last_seen": last_seen, }, lock=False, diff --git a/synapse/storage/schema/delta/54/user_ips_index.sql b/synapse/storage/schema/delta/53/user_ips_index.sql similarity index 77% rename from synapse/storage/schema/delta/54/user_ips_index.sql rename to synapse/storage/schema/delta/53/user_ips_index.sql index 292bcbe8e998..ee7fde529aa2 100644 --- a/synapse/storage/schema/delta/54/user_ips_index.sql +++ b/synapse/storage/schema/delta/53/user_ips_index.sql @@ -13,6 +13,10 @@ * limitations under the License. */ --- add a new unique index to user_ips table +-- delete duplicates INSERT INTO background_updates (update_name, progress_json) VALUES - ('user_ips_device_unique_index', '{}'); + ('user_ips_remove_dupes', '{}'); + +-- add a new unique index to user_ips table +INSERT INTO background_updates (update_name, progress_json, depends_on) VALUES + ('user_ips_device_unique_index', '{}', 'user_ips_remove_dupes'); diff --git a/synapse/storage/schema/full_schemas/54/full.sql.postgres b/synapse/storage/schema/full_schemas/54/full.sql.postgres index 245db5aff0b1..78daa9593d9c 100644 --- a/synapse/storage/schema/full_schemas/54/full.sql.postgres +++ b/synapse/storage/schema/full_schemas/54/full.sql.postgres @@ -3092,7 +3092,7 @@ CREATE INDEX user_ips_device_id ON user_ips USING btree (user_id, device_id, las -- Name: user_ips_device_unique_id; Type: INDEX; Schema: public; Owner: - -- -CREATE UNIQUE INDEX user_ips_device_unique_id ON user_ips USING btree (user_id, access_token, ip, user_agent, device_id); +CREATE UNIQUE INDEX user_ips_device_unique_id ON user_ips USING btree (access_token, ip, user_agent); -- diff --git a/synapse/storage/schema/full_schemas/54/full.sql.sqlite b/synapse/storage/schema/full_schemas/54/full.sql.sqlite index 60b8c6fe7629..670e7f2b3cd8 100644 --- a/synapse/storage/schema/full_schemas/54/full.sql.sqlite +++ b/synapse/storage/schema/full_schemas/54/full.sql.sqlite @@ -1187,11 +1187,9 @@ CREATE UNIQUE INDEX device_lists_remote_cache_unique_id ON device_lists_remote_c device_id ); CREATE UNIQUE INDEX user_ips_device_unique_id ON user_ips( - user_id, access_token, ip, - user_agent, - device_id + user_agent ); CREATE INDEX state_groups_state_type_idx ON state_groups_state( state_group, diff --git a/tests/storage/test_client_ips.py b/tests/storage/test_client_ips.py index 4577e9422b53..58d48790e266 100644 --- a/tests/storage/test_client_ips.py +++ b/tests/storage/test_client_ips.py @@ -32,6 +32,28 @@ def make_homeserver(self, reactor, clock): def prepare(self, hs, reactor, clock): self.store = self.hs.get_datastore() + + def test_cleanup(self): + user_id = "@user:server" + + self.get_success( + self.store.insert_client_ip( + user_id, "access_token1", "ip", "user_agent", "device_id" + ) + ) + self.pump(1) + self.get_success( + self.store.insert_client_ip( + user_id, "access_token2", "ip", "user_agent", "device_id" + ) + ) + self.store._update_client_ips_batch() + self.pump(10) + + result = self.get_success( + self.store._remove_user_ip_dupes_impl() + ) + def test_insert_new_client_ip(self): self.reactor.advance(12345678) From 198ff602836351453fb81c7212cd3d1c56c167d4 Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Wed, 9 Jan 2019 23:52:21 +1100 Subject: [PATCH 06/20] fix --- synapse/storage/client_ips.py | 25 +- synapse/storage/prepare_database.py | 2 +- .../schema/full_schemas/54/full.sql.postgres | 3186 ----------------- .../schema/full_schemas/54/full.sql.sqlite | 1201 ------- .../schema/full_schemas/54/zzz-inserts.sql | 10 - tests/storage/test_client_ips.py | 69 +- 6 files changed, 70 insertions(+), 4423 deletions(-) delete mode 100644 synapse/storage/schema/full_schemas/54/full.sql.postgres delete mode 100644 synapse/storage/schema/full_schemas/54/full.sql.sqlite delete mode 100644 synapse/storage/schema/full_schemas/54/zzz-inserts.sql diff --git a/synapse/storage/client_ips.py b/synapse/storage/client_ips.py index 8cf6e0d400b8..36e2bfa13dad 100644 --- a/synapse/storage/client_ips.py +++ b/synapse/storage/client_ips.py @@ -117,21 +117,28 @@ def _clean(txn, user_id): results = txn.fetchall() seen_before = set() - duplicates = [] + seen_before_latest = {} + duplicates = set() for i in results: key = i[0:3] if key not in seen_before: seen_before.add(key) + seen_before_latest[key] = i[3] else: - duplicates.append(i) - - for d in duplicates: - txn.execute("DELETE FROM user_ips WHERE access_token = ? AND ip = ? AND user_agent = ? AND last_seen = ?", d) - - print(duplicates) - - + duplicates.add(key) + if seen_before_latest[key] < i[3]: + seen_before_latest[key] = i[3] + + for d in sorted(duplicates): + access_token, ip, user_agent = d + txn.execute( + ( + "DELETE FROM user_ips WHERE access_token IS ? AND ip IS ? " + "AND user_agent IS ? AND last_seen != ?" + ), + (access_token, ip, user_agent, seen_before_latest[d]) + ) for user in users: yield self.runInteraction("user_ips_clean", _clean, user[0]) diff --git a/synapse/storage/prepare_database.py b/synapse/storage/prepare_database.py index 48dd64e9a0ec..5155192e2504 100644 --- a/synapse/storage/prepare_database.py +++ b/synapse/storage/prepare_database.py @@ -27,7 +27,7 @@ # Remember to update this number every time a change is made to database # schema files, so the users will be informed on server restarts. -SCHEMA_VERSION = 54 +SCHEMA_VERSION = 53 dir_path = os.path.abspath(os.path.dirname(__file__)) diff --git a/synapse/storage/schema/full_schemas/54/full.sql.postgres b/synapse/storage/schema/full_schemas/54/full.sql.postgres deleted file mode 100644 index 78daa9593d9c..000000000000 --- a/synapse/storage/schema/full_schemas/54/full.sql.postgres +++ /dev/null @@ -1,3186 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 11.1 --- Dumped by pg_dump version 11.1 - --- --- Name: access_tokens; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE access_tokens ( - id bigint NOT NULL, - user_id text NOT NULL, - device_id text, - token text NOT NULL, - last_used bigint -); - - --- --- Name: account_data; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE account_data ( - user_id text NOT NULL, - account_data_type text NOT NULL, - stream_id bigint NOT NULL, - content text NOT NULL -); - - --- --- Name: account_data_max_stream_id; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE account_data_max_stream_id ( - lock character(1) DEFAULT 'X'::bpchar NOT NULL, - stream_id bigint NOT NULL, - CONSTRAINT private_user_data_max_stream_id_lock_check CHECK ((lock = 'X'::bpchar)) -); - - --- --- Name: application_services; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE application_services ( - id bigint NOT NULL, - url text, - token text, - hs_token text, - sender text -); - - --- --- Name: application_services_regex; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE application_services_regex ( - id bigint NOT NULL, - as_id bigint NOT NULL, - namespace integer, - regex text -); - - --- --- Name: application_services_state; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE application_services_state ( - as_id text NOT NULL, - state character varying(5), - last_txn integer -); - - --- --- Name: application_services_txns; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE application_services_txns ( - as_id text NOT NULL, - txn_id integer NOT NULL, - event_ids text NOT NULL -); - - --- --- Name: appservice_room_list; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE appservice_room_list ( - appservice_id text NOT NULL, - network_id text NOT NULL, - room_id text NOT NULL -); - - --- --- Name: appservice_stream_position; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE appservice_stream_position ( - lock character(1) DEFAULT 'X'::bpchar NOT NULL, - stream_ordering bigint, - CONSTRAINT appservice_stream_position_lock_check CHECK ((lock = 'X'::bpchar)) -); - - --- --- Name: background_updates; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE background_updates ( - update_name text NOT NULL, - progress_json text NOT NULL, - depends_on text -); - - --- --- Name: blocked_rooms; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE blocked_rooms ( - room_id text NOT NULL, - user_id text NOT NULL -); - - --- --- Name: cache_invalidation_stream; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE cache_invalidation_stream ( - stream_id bigint, - cache_func text, - keys text[], - invalidation_ts bigint -); - - --- --- Name: current_state_delta_stream; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE current_state_delta_stream ( - stream_id bigint NOT NULL, - room_id text NOT NULL, - type text NOT NULL, - state_key text NOT NULL, - event_id text, - prev_event_id text -); - - --- --- Name: current_state_events; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE current_state_events ( - event_id text NOT NULL, - room_id text NOT NULL, - type text NOT NULL, - state_key text NOT NULL -); - - --- --- Name: current_state_resets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE current_state_resets ( - event_stream_ordering bigint NOT NULL -); - - --- --- Name: deleted_pushers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE deleted_pushers ( - stream_id bigint NOT NULL, - app_id text NOT NULL, - pushkey text NOT NULL, - user_id text NOT NULL -); - - --- --- Name: destinations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE destinations ( - destination text NOT NULL, - retry_last_ts bigint, - retry_interval integer -); - - --- --- Name: device_federation_inbox; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE device_federation_inbox ( - origin text NOT NULL, - message_id text NOT NULL, - received_ts bigint NOT NULL -); - - --- --- Name: device_federation_outbox; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE device_federation_outbox ( - destination text NOT NULL, - stream_id bigint NOT NULL, - queued_ts bigint NOT NULL, - messages_json text NOT NULL -); - - --- --- Name: device_inbox; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE device_inbox ( - user_id text NOT NULL, - device_id text NOT NULL, - stream_id bigint NOT NULL, - message_json text NOT NULL -); - - --- --- Name: device_lists_outbound_last_success; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE device_lists_outbound_last_success ( - destination text NOT NULL, - user_id text NOT NULL, - stream_id bigint NOT NULL -); - - --- --- Name: device_lists_outbound_pokes; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE device_lists_outbound_pokes ( - destination text NOT NULL, - stream_id bigint NOT NULL, - user_id text NOT NULL, - device_id text NOT NULL, - sent boolean NOT NULL, - ts bigint NOT NULL -); - - --- --- Name: device_lists_remote_cache; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE device_lists_remote_cache ( - user_id text NOT NULL, - device_id text NOT NULL, - content text NOT NULL -); - - --- --- Name: device_lists_remote_extremeties; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE device_lists_remote_extremeties ( - user_id text NOT NULL, - stream_id text NOT NULL -); - - --- --- Name: device_lists_stream; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE device_lists_stream ( - stream_id bigint NOT NULL, - user_id text NOT NULL, - device_id text NOT NULL -); - - --- --- Name: device_max_stream_id; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE device_max_stream_id ( - stream_id bigint NOT NULL -); - - --- --- Name: devices; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE devices ( - user_id text NOT NULL, - device_id text NOT NULL, - display_name text -); - - --- --- Name: e2e_device_keys_json; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE e2e_device_keys_json ( - user_id text NOT NULL, - device_id text NOT NULL, - ts_added_ms bigint NOT NULL, - key_json text NOT NULL -); - - --- --- Name: e2e_one_time_keys_json; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE e2e_one_time_keys_json ( - user_id text NOT NULL, - device_id text NOT NULL, - algorithm text NOT NULL, - key_id text NOT NULL, - ts_added_ms bigint NOT NULL, - key_json text NOT NULL -); - - --- --- Name: e2e_room_keys; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE e2e_room_keys ( - user_id text NOT NULL, - room_id text NOT NULL, - session_id text NOT NULL, - version bigint NOT NULL, - first_message_index integer, - forwarded_count integer, - is_verified boolean, - session_data text NOT NULL -); - - --- --- Name: e2e_room_keys_versions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE e2e_room_keys_versions ( - user_id text NOT NULL, - version bigint NOT NULL, - algorithm text NOT NULL, - auth_data text NOT NULL, - deleted smallint DEFAULT 0 NOT NULL -); - - --- --- Name: erased_users; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE erased_users ( - user_id text NOT NULL -); - - --- --- Name: event_auth; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_auth ( - event_id text NOT NULL, - auth_id text NOT NULL, - room_id text NOT NULL -); - - --- --- Name: event_backward_extremities; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_backward_extremities ( - event_id text NOT NULL, - room_id text NOT NULL -); - - --- --- Name: event_content_hashes; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_content_hashes ( - event_id text, - algorithm text, - hash bytea -); - - --- --- Name: event_destinations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_destinations ( - event_id text NOT NULL, - destination text NOT NULL, - delivered_ts bigint DEFAULT 0 -); - - --- --- Name: event_edge_hashes; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_edge_hashes ( - event_id text, - prev_event_id text, - algorithm text, - hash bytea -); - - --- --- Name: event_edges; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_edges ( - event_id text NOT NULL, - prev_event_id text NOT NULL, - room_id text NOT NULL, - is_state boolean NOT NULL -); - - --- --- Name: event_forward_extremities; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_forward_extremities ( - event_id text NOT NULL, - room_id text NOT NULL -); - - --- --- Name: event_json; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_json ( - event_id text NOT NULL, - room_id text NOT NULL, - internal_metadata text NOT NULL, - json text NOT NULL -); - - --- --- Name: event_push_actions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_push_actions ( - room_id text NOT NULL, - event_id text NOT NULL, - user_id text NOT NULL, - profile_tag character varying(32), - actions text NOT NULL, - topological_ordering bigint, - stream_ordering bigint, - notif smallint, - highlight smallint -); - - --- --- Name: event_push_actions_staging; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_push_actions_staging ( - event_id text NOT NULL, - user_id text NOT NULL, - actions text NOT NULL, - notif smallint NOT NULL, - highlight smallint NOT NULL -); - - --- --- Name: event_push_summary; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_push_summary ( - user_id text NOT NULL, - room_id text NOT NULL, - notif_count bigint NOT NULL, - stream_ordering bigint NOT NULL -); - - --- --- Name: event_push_summary_stream_ordering; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_push_summary_stream_ordering ( - lock character(1) DEFAULT 'X'::bpchar NOT NULL, - stream_ordering bigint NOT NULL, - CONSTRAINT event_push_summary_stream_ordering_lock_check CHECK ((lock = 'X'::bpchar)) -); - - --- --- Name: event_reference_hashes; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_reference_hashes ( - event_id text, - algorithm text, - hash bytea -); - - --- --- Name: event_reports; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_reports ( - id bigint NOT NULL, - received_ts bigint NOT NULL, - room_id text NOT NULL, - event_id text NOT NULL, - user_id text NOT NULL, - reason text, - content text -); - - --- --- Name: event_search; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_search ( - event_id text, - room_id text, - sender text, - key text, - vector tsvector, - origin_server_ts bigint, - stream_ordering bigint -); - - --- --- Name: event_signatures; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_signatures ( - event_id text, - signature_name text, - key_id text, - signature bytea -); - - --- --- Name: event_to_state_groups; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE event_to_state_groups ( - event_id text NOT NULL, - state_group bigint NOT NULL -); - - --- --- Name: events; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE events ( - stream_ordering integer NOT NULL, - topological_ordering bigint NOT NULL, - event_id text NOT NULL, - type text NOT NULL, - room_id text NOT NULL, - content text, - unrecognized_keys text, - processed boolean NOT NULL, - outlier boolean NOT NULL, - depth bigint DEFAULT 0 NOT NULL, - origin_server_ts bigint, - received_ts bigint, - sender text, - contains_url boolean -); - - --- --- Name: ex_outlier_stream; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ex_outlier_stream ( - event_stream_ordering bigint NOT NULL, - event_id text NOT NULL, - state_group bigint NOT NULL -); - - --- --- Name: federation_stream_position; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE federation_stream_position ( - type text NOT NULL, - stream_id integer NOT NULL -); - - --- --- Name: feedback; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE feedback ( - event_id text NOT NULL, - feedback_type text, - target_event_id text, - sender text, - room_id text -); - - --- --- Name: group_attestations_remote; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE group_attestations_remote ( - group_id text NOT NULL, - user_id text NOT NULL, - valid_until_ms bigint NOT NULL, - attestation_json text NOT NULL -); - - --- --- Name: group_attestations_renewals; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE group_attestations_renewals ( - group_id text NOT NULL, - user_id text NOT NULL, - valid_until_ms bigint NOT NULL -); - - --- --- Name: group_invites; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE group_invites ( - group_id text NOT NULL, - user_id text NOT NULL -); - - --- --- Name: group_roles; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE group_roles ( - group_id text NOT NULL, - role_id text NOT NULL, - profile text NOT NULL, - is_public boolean NOT NULL -); - - --- --- Name: group_room_categories; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE group_room_categories ( - group_id text NOT NULL, - category_id text NOT NULL, - profile text NOT NULL, - is_public boolean NOT NULL -); - - --- --- Name: group_rooms; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE group_rooms ( - group_id text NOT NULL, - room_id text NOT NULL, - is_public boolean NOT NULL -); - - --- --- Name: group_summary_roles; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE group_summary_roles ( - group_id text NOT NULL, - role_id text NOT NULL, - role_order bigint NOT NULL, - CONSTRAINT group_summary_roles_role_order_check CHECK ((role_order > 0)) -); - - --- --- Name: group_summary_room_categories; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE group_summary_room_categories ( - group_id text NOT NULL, - category_id text NOT NULL, - cat_order bigint NOT NULL, - CONSTRAINT group_summary_room_categories_cat_order_check CHECK ((cat_order > 0)) -); - - --- --- Name: group_summary_rooms; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE group_summary_rooms ( - group_id text NOT NULL, - room_id text NOT NULL, - category_id text NOT NULL, - room_order bigint NOT NULL, - is_public boolean NOT NULL, - CONSTRAINT group_summary_rooms_room_order_check CHECK ((room_order > 0)) -); - - --- --- Name: group_summary_users; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE group_summary_users ( - group_id text NOT NULL, - user_id text NOT NULL, - role_id text NOT NULL, - user_order bigint NOT NULL, - is_public boolean NOT NULL -); - - --- --- Name: group_users; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE group_users ( - group_id text NOT NULL, - user_id text NOT NULL, - is_admin boolean NOT NULL, - is_public boolean NOT NULL -); - - --- --- Name: groups; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE groups ( - group_id text NOT NULL, - name text, - avatar_url text, - short_description text, - long_description text, - is_public boolean NOT NULL, - join_policy text DEFAULT 'invite'::text NOT NULL -); - - --- --- Name: guest_access; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE guest_access ( - event_id text NOT NULL, - room_id text NOT NULL, - guest_access text NOT NULL -); - - --- --- Name: history_visibility; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_visibility ( - event_id text NOT NULL, - room_id text NOT NULL, - history_visibility text NOT NULL -); - - --- --- Name: local_group_membership; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE local_group_membership ( - group_id text NOT NULL, - user_id text NOT NULL, - is_admin boolean NOT NULL, - membership text NOT NULL, - is_publicised boolean NOT NULL, - content text NOT NULL -); - - --- --- Name: local_group_updates; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE local_group_updates ( - stream_id bigint NOT NULL, - group_id text NOT NULL, - user_id text NOT NULL, - type text NOT NULL, - content text NOT NULL -); - - --- --- Name: local_invites; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE local_invites ( - stream_id bigint NOT NULL, - inviter text NOT NULL, - invitee text NOT NULL, - event_id text NOT NULL, - room_id text NOT NULL, - locally_rejected text, - replaced_by text -); - - --- --- Name: local_media_repository; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE local_media_repository ( - media_id text, - media_type text, - media_length integer, - created_ts bigint, - upload_name text, - user_id text, - quarantined_by text, - url_cache text, - last_access_ts bigint -); - - --- --- Name: local_media_repository_thumbnails; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE local_media_repository_thumbnails ( - media_id text, - thumbnail_width integer, - thumbnail_height integer, - thumbnail_type text, - thumbnail_method text, - thumbnail_length integer -); - - --- --- Name: local_media_repository_url_cache; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE local_media_repository_url_cache ( - url text, - response_code integer, - etag text, - expires_ts bigint, - og text, - media_id text, - download_ts bigint -); - - --- --- Name: monthly_active_users; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE monthly_active_users ( - user_id text NOT NULL, - "timestamp" bigint NOT NULL -); - - --- --- Name: open_id_tokens; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE open_id_tokens ( - token text NOT NULL, - ts_valid_until_ms bigint NOT NULL, - user_id text NOT NULL -); - - --- --- Name: presence; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE presence ( - user_id text NOT NULL, - state character varying(20), - status_msg text, - mtime bigint -); - - --- --- Name: presence_allow_inbound; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE presence_allow_inbound ( - observed_user_id text NOT NULL, - observer_user_id text NOT NULL -); - - --- --- Name: presence_list; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE presence_list ( - user_id text NOT NULL, - observed_user_id text NOT NULL, - accepted boolean NOT NULL -); - - --- --- Name: presence_stream; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE presence_stream ( - stream_id bigint, - user_id text, - state text, - last_active_ts bigint, - last_federation_update_ts bigint, - last_user_sync_ts bigint, - status_msg text, - currently_active boolean -); - - --- --- Name: profiles; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE profiles ( - user_id text NOT NULL, - displayname text, - avatar_url text -); - - --- --- Name: public_room_list_stream; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public_room_list_stream ( - stream_id bigint NOT NULL, - room_id text NOT NULL, - visibility boolean NOT NULL, - appservice_id text, - network_id text -); - - --- --- Name: push_rules; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE push_rules ( - id bigint NOT NULL, - user_name text NOT NULL, - rule_id text NOT NULL, - priority_class smallint NOT NULL, - priority integer DEFAULT 0 NOT NULL, - conditions text NOT NULL, - actions text NOT NULL -); - - --- --- Name: push_rules_enable; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE push_rules_enable ( - id bigint NOT NULL, - user_name text NOT NULL, - rule_id text NOT NULL, - enabled smallint -); - - --- --- Name: push_rules_stream; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE push_rules_stream ( - stream_id bigint NOT NULL, - event_stream_ordering bigint NOT NULL, - user_id text NOT NULL, - rule_id text NOT NULL, - op text NOT NULL, - priority_class smallint, - priority integer, - conditions text, - actions text -); - - --- --- Name: pusher_throttle; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pusher_throttle ( - pusher bigint NOT NULL, - room_id text NOT NULL, - last_sent_ts bigint, - throttle_ms bigint -); - - --- --- Name: pushers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pushers ( - id bigint NOT NULL, - user_name text NOT NULL, - access_token bigint, - profile_tag text NOT NULL, - kind text NOT NULL, - app_id text NOT NULL, - app_display_name text NOT NULL, - device_display_name text NOT NULL, - pushkey text NOT NULL, - ts bigint NOT NULL, - lang text, - data text, - last_stream_ordering integer, - last_success bigint, - failing_since bigint -); - - --- --- Name: ratelimit_override; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ratelimit_override ( - user_id text NOT NULL, - messages_per_second bigint, - burst_count bigint -); - - --- --- Name: receipts_graph; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE receipts_graph ( - room_id text NOT NULL, - receipt_type text NOT NULL, - user_id text NOT NULL, - event_ids text NOT NULL, - data text NOT NULL -); - - --- --- Name: receipts_linearized; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE receipts_linearized ( - stream_id bigint NOT NULL, - room_id text NOT NULL, - receipt_type text NOT NULL, - user_id text NOT NULL, - event_id text NOT NULL, - data text NOT NULL -); - - --- --- Name: received_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE received_transactions ( - transaction_id text, - origin text, - ts bigint, - response_code integer, - response_json bytea, - has_been_referenced smallint DEFAULT 0 -); - - --- --- Name: redactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE redactions ( - event_id text NOT NULL, - redacts text NOT NULL -); - - --- --- Name: rejections; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE rejections ( - event_id text NOT NULL, - reason text NOT NULL, - last_check text NOT NULL -); - - --- --- Name: remote_media_cache; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE remote_media_cache ( - media_origin text, - media_id text, - media_type text, - created_ts bigint, - upload_name text, - media_length integer, - filesystem_id text, - last_access_ts bigint, - quarantined_by text -); - - --- --- Name: remote_media_cache_thumbnails; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE remote_media_cache_thumbnails ( - media_origin text, - media_id text, - thumbnail_width integer, - thumbnail_height integer, - thumbnail_method text, - thumbnail_type text, - thumbnail_length integer, - filesystem_id text -); - - --- --- Name: remote_profile_cache; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE remote_profile_cache ( - user_id text NOT NULL, - displayname text, - avatar_url text, - last_check bigint NOT NULL -); - - --- --- Name: room_account_data; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE room_account_data ( - user_id text NOT NULL, - room_id text NOT NULL, - account_data_type text NOT NULL, - stream_id bigint NOT NULL, - content text NOT NULL -); - - --- --- Name: room_alias_servers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE room_alias_servers ( - room_alias text NOT NULL, - server text NOT NULL -); - - --- --- Name: room_aliases; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE room_aliases ( - room_alias text NOT NULL, - room_id text NOT NULL, - creator text -); - - --- --- Name: room_depth; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE room_depth ( - room_id text NOT NULL, - min_depth integer NOT NULL -); - - --- --- Name: room_hosts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE room_hosts ( - room_id text NOT NULL, - host text NOT NULL -); - - --- --- Name: room_memberships; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE room_memberships ( - event_id text NOT NULL, - user_id text NOT NULL, - sender text NOT NULL, - room_id text NOT NULL, - membership text NOT NULL, - forgotten integer DEFAULT 0, - display_name text, - avatar_url text -); - - --- --- Name: room_names; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE room_names ( - event_id text NOT NULL, - room_id text NOT NULL, - name text NOT NULL -); - - --- --- Name: room_tags; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE room_tags ( - user_id text NOT NULL, - room_id text NOT NULL, - tag text NOT NULL, - content text NOT NULL -); - - --- --- Name: room_tags_revisions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE room_tags_revisions ( - user_id text NOT NULL, - room_id text NOT NULL, - stream_id bigint NOT NULL -); - - --- --- Name: rooms; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE rooms ( - room_id text NOT NULL, - is_public boolean, - creator text -); - - --- --- Name: server_keys_json; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE server_keys_json ( - server_name text NOT NULL, - key_id text NOT NULL, - from_server text NOT NULL, - ts_added_ms bigint NOT NULL, - ts_valid_until_ms bigint NOT NULL, - key_json bytea NOT NULL -); - - --- --- Name: server_signature_keys; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE server_signature_keys ( - server_name text, - key_id text, - from_server text, - ts_added_ms bigint, - verify_key bytea -); - - --- --- Name: server_tls_certificates; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE server_tls_certificates ( - server_name text, - fingerprint text, - from_server text, - ts_added_ms bigint, - tls_certificate bytea -); - - --- --- Name: state_events; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE state_events ( - event_id text NOT NULL, - room_id text NOT NULL, - type text NOT NULL, - state_key text NOT NULL, - prev_state text -); - - --- --- Name: state_forward_extremities; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE state_forward_extremities ( - event_id text NOT NULL, - room_id text NOT NULL, - type text NOT NULL, - state_key text NOT NULL -); - - --- --- Name: state_group_edges; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE state_group_edges ( - state_group bigint NOT NULL, - prev_state_group bigint NOT NULL -); - - --- --- Name: state_group_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE state_group_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: state_groups; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE state_groups ( - id bigint NOT NULL, - room_id text NOT NULL, - event_id text NOT NULL -); - - --- --- Name: state_groups_state; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE state_groups_state ( - state_group bigint NOT NULL, - room_id text NOT NULL, - type text NOT NULL, - state_key text NOT NULL, - event_id text NOT NULL -); - - --- --- Name: stats_reporting; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE stats_reporting ( - reported_stream_token integer, - reported_time bigint -); - - --- --- Name: stream_ordering_to_exterm; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE stream_ordering_to_exterm ( - stream_ordering bigint NOT NULL, - room_id text NOT NULL, - event_id text NOT NULL -); - - --- --- Name: threepid_guest_access_tokens; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE threepid_guest_access_tokens ( - medium text, - address text, - guest_access_token text, - first_inviter text -); - - --- --- Name: topics; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE topics ( - event_id text NOT NULL, - room_id text NOT NULL, - topic text NOT NULL -); - - --- --- Name: transaction_id_to_pdu; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE transaction_id_to_pdu ( - transaction_id integer, - destination text, - pdu_id text, - pdu_origin text -); - - --- --- Name: user_daily_visits; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE user_daily_visits ( - user_id text NOT NULL, - device_id text, - "timestamp" bigint NOT NULL -); - - --- --- Name: user_directory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE user_directory ( - user_id text NOT NULL, - room_id text, - display_name text, - avatar_url text -); - - --- --- Name: user_directory_search; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE user_directory_search ( - user_id text NOT NULL, - vector tsvector -); - - --- --- Name: user_directory_stream_pos; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE user_directory_stream_pos ( - lock character(1) DEFAULT 'X'::bpchar NOT NULL, - stream_id bigint, - CONSTRAINT user_directory_stream_pos_lock_check CHECK ((lock = 'X'::bpchar)) -); - - --- --- Name: user_filters; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE user_filters ( - user_id text, - filter_id bigint, - filter_json bytea -); - - --- --- Name: user_ips; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE user_ips ( - user_id text NOT NULL, - access_token text NOT NULL, - device_id text, - ip text NOT NULL, - user_agent text NOT NULL, - last_seen bigint NOT NULL -); - - --- --- Name: user_threepids; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE user_threepids ( - user_id text NOT NULL, - medium text NOT NULL, - address text NOT NULL, - validated_at bigint NOT NULL, - added_at bigint NOT NULL -); - - --- --- Name: users; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE users ( - name text, - password_hash text, - creation_ts bigint, - admin smallint DEFAULT 0 NOT NULL, - upgrade_ts bigint, - is_guest smallint DEFAULT 0 NOT NULL, - appservice_id text, - consent_version text, - consent_server_notice_sent text, - user_type text -); - - --- --- Name: users_in_public_rooms; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE users_in_public_rooms ( - user_id text NOT NULL, - room_id text NOT NULL -); - - --- --- Name: users_pending_deactivation; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE users_pending_deactivation ( - user_id text NOT NULL -); - - --- --- Name: users_who_share_rooms; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE users_who_share_rooms ( - user_id text NOT NULL, - other_user_id text NOT NULL, - room_id text NOT NULL, - share_private boolean NOT NULL -); - - --- --- Name: access_tokens access_tokens_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY access_tokens - ADD CONSTRAINT access_tokens_pkey PRIMARY KEY (id); - - --- --- Name: access_tokens access_tokens_token_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY access_tokens - ADD CONSTRAINT access_tokens_token_key UNIQUE (token); - - --- --- Name: account_data account_data_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY account_data - ADD CONSTRAINT account_data_uniqueness UNIQUE (user_id, account_data_type); - - --- --- Name: application_services application_services_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY application_services - ADD CONSTRAINT application_services_pkey PRIMARY KEY (id); - - --- --- Name: application_services_regex application_services_regex_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY application_services_regex - ADD CONSTRAINT application_services_regex_pkey PRIMARY KEY (id); - - --- --- Name: application_services_state application_services_state_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY application_services_state - ADD CONSTRAINT application_services_state_pkey PRIMARY KEY (as_id); - - --- --- Name: application_services application_services_token_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY application_services - ADD CONSTRAINT application_services_token_key UNIQUE (token); - - --- --- Name: application_services_txns application_services_txns_as_id_txn_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY application_services_txns - ADD CONSTRAINT application_services_txns_as_id_txn_id_key UNIQUE (as_id, txn_id); - - --- --- Name: appservice_stream_position appservice_stream_position_lock_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY appservice_stream_position - ADD CONSTRAINT appservice_stream_position_lock_key UNIQUE (lock); - - --- --- Name: background_updates background_updates_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY background_updates - ADD CONSTRAINT background_updates_uniqueness UNIQUE (update_name); - - --- --- Name: current_state_events current_state_events_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY current_state_events - ADD CONSTRAINT current_state_events_event_id_key UNIQUE (event_id); - - --- --- Name: current_state_events current_state_events_room_id_type_state_key_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY current_state_events - ADD CONSTRAINT current_state_events_room_id_type_state_key_key UNIQUE (room_id, type, state_key); - - --- --- Name: current_state_resets current_state_resets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY current_state_resets - ADD CONSTRAINT current_state_resets_pkey PRIMARY KEY (event_stream_ordering); - - --- --- Name: destinations destinations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY destinations - ADD CONSTRAINT destinations_pkey PRIMARY KEY (destination); - - --- --- Name: devices device_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY devices - ADD CONSTRAINT device_uniqueness UNIQUE (user_id, device_id); - - --- --- Name: e2e_device_keys_json e2e_device_keys_json_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY e2e_device_keys_json - ADD CONSTRAINT e2e_device_keys_json_uniqueness UNIQUE (user_id, device_id); - - --- --- Name: e2e_one_time_keys_json e2e_one_time_keys_json_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY e2e_one_time_keys_json - ADD CONSTRAINT e2e_one_time_keys_json_uniqueness UNIQUE (user_id, device_id, algorithm, key_id); - - --- --- Name: event_backward_extremities event_backward_extremities_event_id_room_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY event_backward_extremities - ADD CONSTRAINT event_backward_extremities_event_id_room_id_key UNIQUE (event_id, room_id); - - --- --- Name: event_content_hashes event_content_hashes_event_id_algorithm_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY event_content_hashes - ADD CONSTRAINT event_content_hashes_event_id_algorithm_key UNIQUE (event_id, algorithm); - - --- --- Name: event_destinations event_destinations_event_id_destination_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY event_destinations - ADD CONSTRAINT event_destinations_event_id_destination_key UNIQUE (event_id, destination); - - --- --- Name: event_edge_hashes event_edge_hashes_event_id_prev_event_id_algorithm_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY event_edge_hashes - ADD CONSTRAINT event_edge_hashes_event_id_prev_event_id_algorithm_key UNIQUE (event_id, prev_event_id, algorithm); - - --- --- Name: event_edges event_edges_event_id_prev_event_id_room_id_is_state_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY event_edges - ADD CONSTRAINT event_edges_event_id_prev_event_id_room_id_is_state_key UNIQUE (event_id, prev_event_id, room_id, is_state); - - --- --- Name: event_forward_extremities event_forward_extremities_event_id_room_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY event_forward_extremities - ADD CONSTRAINT event_forward_extremities_event_id_room_id_key UNIQUE (event_id, room_id); - - --- --- Name: event_push_actions event_id_user_id_profile_tag_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY event_push_actions - ADD CONSTRAINT event_id_user_id_profile_tag_uniqueness UNIQUE (room_id, event_id, user_id, profile_tag); - - --- --- Name: event_json event_json_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY event_json - ADD CONSTRAINT event_json_event_id_key UNIQUE (event_id); - - --- --- Name: event_push_summary_stream_ordering event_push_summary_stream_ordering_lock_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY event_push_summary_stream_ordering - ADD CONSTRAINT event_push_summary_stream_ordering_lock_key UNIQUE (lock); - - --- --- Name: event_reference_hashes event_reference_hashes_event_id_algorithm_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY event_reference_hashes - ADD CONSTRAINT event_reference_hashes_event_id_algorithm_key UNIQUE (event_id, algorithm); - - --- --- Name: event_reports event_reports_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY event_reports - ADD CONSTRAINT event_reports_pkey PRIMARY KEY (id); - - --- --- Name: event_signatures event_signatures_event_id_signature_name_key_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY event_signatures - ADD CONSTRAINT event_signatures_event_id_signature_name_key_id_key UNIQUE (event_id, signature_name, key_id); - - --- --- Name: event_to_state_groups event_to_state_groups_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY event_to_state_groups - ADD CONSTRAINT event_to_state_groups_event_id_key UNIQUE (event_id); - - --- --- Name: events events_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY events - ADD CONSTRAINT events_event_id_key UNIQUE (event_id); - - --- --- Name: events events_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY events - ADD CONSTRAINT events_pkey PRIMARY KEY (stream_ordering); - - --- --- Name: ex_outlier_stream ex_outlier_stream_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ex_outlier_stream - ADD CONSTRAINT ex_outlier_stream_pkey PRIMARY KEY (event_stream_ordering); - - --- --- Name: feedback feedback_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY feedback - ADD CONSTRAINT feedback_event_id_key UNIQUE (event_id); - - --- --- Name: group_roles group_roles_group_id_role_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY group_roles - ADD CONSTRAINT group_roles_group_id_role_id_key UNIQUE (group_id, role_id); - - --- --- Name: group_room_categories group_room_categories_group_id_category_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY group_room_categories - ADD CONSTRAINT group_room_categories_group_id_category_id_key UNIQUE (group_id, category_id); - - --- --- Name: group_summary_roles group_summary_roles_group_id_role_id_role_order_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY group_summary_roles - ADD CONSTRAINT group_summary_roles_group_id_role_id_role_order_key UNIQUE (group_id, role_id, role_order); - - --- --- Name: group_summary_room_categories group_summary_room_categories_group_id_category_id_cat_orde_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY group_summary_room_categories - ADD CONSTRAINT group_summary_room_categories_group_id_category_id_cat_orde_key UNIQUE (group_id, category_id, cat_order); - - --- --- Name: group_summary_rooms group_summary_rooms_group_id_category_id_room_id_room_order_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY group_summary_rooms - ADD CONSTRAINT group_summary_rooms_group_id_category_id_room_id_room_order_key UNIQUE (group_id, category_id, room_id, room_order); - - --- --- Name: guest_access guest_access_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY guest_access - ADD CONSTRAINT guest_access_event_id_key UNIQUE (event_id); - - --- --- Name: history_visibility history_visibility_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_visibility - ADD CONSTRAINT history_visibility_event_id_key UNIQUE (event_id); - - --- --- Name: local_media_repository local_media_repository_media_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY local_media_repository - ADD CONSTRAINT local_media_repository_media_id_key UNIQUE (media_id); - - --- --- Name: local_media_repository_thumbnails local_media_repository_thumbn_media_id_thumbnail_width_thum_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY local_media_repository_thumbnails - ADD CONSTRAINT local_media_repository_thumbn_media_id_thumbnail_width_thum_key UNIQUE (media_id, thumbnail_width, thumbnail_height, thumbnail_type); - - --- --- Name: user_threepids medium_address; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY user_threepids - ADD CONSTRAINT medium_address UNIQUE (medium, address); - - --- --- Name: open_id_tokens open_id_tokens_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY open_id_tokens - ADD CONSTRAINT open_id_tokens_pkey PRIMARY KEY (token); - - --- --- Name: presence_allow_inbound presence_allow_inbound_observed_user_id_observer_user_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY presence_allow_inbound - ADD CONSTRAINT presence_allow_inbound_observed_user_id_observer_user_id_key UNIQUE (observed_user_id, observer_user_id); - - --- --- Name: presence_list presence_list_user_id_observed_user_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY presence_list - ADD CONSTRAINT presence_list_user_id_observed_user_id_key UNIQUE (user_id, observed_user_id); - - --- --- Name: presence presence_user_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY presence - ADD CONSTRAINT presence_user_id_key UNIQUE (user_id); - - --- --- Name: account_data_max_stream_id private_user_data_max_stream_id_lock_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY account_data_max_stream_id - ADD CONSTRAINT private_user_data_max_stream_id_lock_key UNIQUE (lock); - - --- --- Name: profiles profiles_user_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY profiles - ADD CONSTRAINT profiles_user_id_key UNIQUE (user_id); - - --- --- Name: push_rules_enable push_rules_enable_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY push_rules_enable - ADD CONSTRAINT push_rules_enable_pkey PRIMARY KEY (id); - - --- --- Name: push_rules_enable push_rules_enable_user_name_rule_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY push_rules_enable - ADD CONSTRAINT push_rules_enable_user_name_rule_id_key UNIQUE (user_name, rule_id); - - --- --- Name: push_rules push_rules_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY push_rules - ADD CONSTRAINT push_rules_pkey PRIMARY KEY (id); - - --- --- Name: push_rules push_rules_user_name_rule_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY push_rules - ADD CONSTRAINT push_rules_user_name_rule_id_key UNIQUE (user_name, rule_id); - - --- --- Name: pusher_throttle pusher_throttle_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pusher_throttle - ADD CONSTRAINT pusher_throttle_pkey PRIMARY KEY (pusher, room_id); - - --- --- Name: pushers pushers2_app_id_pushkey_user_name_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pushers - ADD CONSTRAINT pushers2_app_id_pushkey_user_name_key UNIQUE (app_id, pushkey, user_name); - - --- --- Name: pushers pushers2_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pushers - ADD CONSTRAINT pushers2_pkey PRIMARY KEY (id); - - --- --- Name: receipts_graph receipts_graph_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY receipts_graph - ADD CONSTRAINT receipts_graph_uniqueness UNIQUE (room_id, receipt_type, user_id); - - --- --- Name: receipts_linearized receipts_linearized_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY receipts_linearized - ADD CONSTRAINT receipts_linearized_uniqueness UNIQUE (room_id, receipt_type, user_id); - - --- --- Name: received_transactions received_transactions_transaction_id_origin_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY received_transactions - ADD CONSTRAINT received_transactions_transaction_id_origin_key UNIQUE (transaction_id, origin); - - --- --- Name: redactions redactions_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY redactions - ADD CONSTRAINT redactions_event_id_key UNIQUE (event_id); - - --- --- Name: rejections rejections_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY rejections - ADD CONSTRAINT rejections_event_id_key UNIQUE (event_id); - - --- --- Name: remote_media_cache remote_media_cache_media_origin_media_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY remote_media_cache - ADD CONSTRAINT remote_media_cache_media_origin_media_id_key UNIQUE (media_origin, media_id); - - --- --- Name: remote_media_cache_thumbnails remote_media_cache_thumbnails_media_origin_media_id_thumbna_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY remote_media_cache_thumbnails - ADD CONSTRAINT remote_media_cache_thumbnails_media_origin_media_id_thumbna_key UNIQUE (media_origin, media_id, thumbnail_width, thumbnail_height, thumbnail_type); - - --- --- Name: room_account_data room_account_data_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY room_account_data - ADD CONSTRAINT room_account_data_uniqueness UNIQUE (user_id, room_id, account_data_type); - - --- --- Name: room_aliases room_aliases_room_alias_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY room_aliases - ADD CONSTRAINT room_aliases_room_alias_key UNIQUE (room_alias); - - --- --- Name: room_depth room_depth_room_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY room_depth - ADD CONSTRAINT room_depth_room_id_key UNIQUE (room_id); - - --- --- Name: room_hosts room_hosts_room_id_host_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY room_hosts - ADD CONSTRAINT room_hosts_room_id_host_key UNIQUE (room_id, host); - - --- --- Name: room_memberships room_memberships_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY room_memberships - ADD CONSTRAINT room_memberships_event_id_key UNIQUE (event_id); - - --- --- Name: room_names room_names_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY room_names - ADD CONSTRAINT room_names_event_id_key UNIQUE (event_id); - - --- --- Name: room_tags_revisions room_tag_revisions_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY room_tags_revisions - ADD CONSTRAINT room_tag_revisions_uniqueness UNIQUE (user_id, room_id); - - --- --- Name: room_tags room_tag_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY room_tags - ADD CONSTRAINT room_tag_uniqueness UNIQUE (user_id, room_id, tag); - - --- --- Name: rooms rooms_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY rooms - ADD CONSTRAINT rooms_pkey PRIMARY KEY (room_id); - - --- --- Name: server_keys_json server_keys_json_uniqueness; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY server_keys_json - ADD CONSTRAINT server_keys_json_uniqueness UNIQUE (server_name, key_id, from_server); - - --- --- Name: server_signature_keys server_signature_keys_server_name_key_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY server_signature_keys - ADD CONSTRAINT server_signature_keys_server_name_key_id_key UNIQUE (server_name, key_id); - - --- --- Name: server_tls_certificates server_tls_certificates_server_name_fingerprint_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY server_tls_certificates - ADD CONSTRAINT server_tls_certificates_server_name_fingerprint_key UNIQUE (server_name, fingerprint); - - --- --- Name: state_events state_events_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY state_events - ADD CONSTRAINT state_events_event_id_key UNIQUE (event_id); - - --- --- Name: state_forward_extremities state_forward_extremities_event_id_room_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY state_forward_extremities - ADD CONSTRAINT state_forward_extremities_event_id_room_id_key UNIQUE (event_id, room_id); - - --- --- Name: state_groups state_groups_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY state_groups - ADD CONSTRAINT state_groups_pkey PRIMARY KEY (id); - - --- --- Name: topics topics_event_id_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY topics - ADD CONSTRAINT topics_event_id_key UNIQUE (event_id); - - --- --- Name: transaction_id_to_pdu transaction_id_to_pdu_transaction_id_destination_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY transaction_id_to_pdu - ADD CONSTRAINT transaction_id_to_pdu_transaction_id_destination_key UNIQUE (transaction_id, destination); - - --- --- Name: user_directory_stream_pos user_directory_stream_pos_lock_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY user_directory_stream_pos - ADD CONSTRAINT user_directory_stream_pos_lock_key UNIQUE (lock); - - --- --- Name: users users_name_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY users - ADD CONSTRAINT users_name_key UNIQUE (name); - - --- --- Name: access_tokens_device_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX access_tokens_device_id ON access_tokens USING btree (user_id, device_id); - - --- --- Name: account_data_stream_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX account_data_stream_id ON account_data USING btree (user_id, stream_id); - - --- --- Name: application_services_txns_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX application_services_txns_id ON application_services_txns USING btree (as_id); - - --- --- Name: appservice_room_list_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX appservice_room_list_idx ON appservice_room_list USING btree (appservice_id, network_id, room_id); - - --- --- Name: blocked_rooms_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX blocked_rooms_idx ON blocked_rooms USING btree (room_id); - - --- --- Name: cache_invalidation_stream_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX cache_invalidation_stream_id ON cache_invalidation_stream USING btree (stream_id); - - --- --- Name: current_state_delta_stream_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX current_state_delta_stream_idx ON current_state_delta_stream USING btree (stream_id); - - --- --- Name: current_state_events_member_index; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX current_state_events_member_index ON current_state_events USING btree (state_key) WHERE (type = 'm.room.member'::text); - - --- --- Name: deleted_pushers_stream_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX deleted_pushers_stream_id ON deleted_pushers USING btree (stream_id); - - --- --- Name: device_federation_inbox_sender_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX device_federation_inbox_sender_id ON device_federation_inbox USING btree (origin, message_id); - - --- --- Name: device_federation_outbox_destination_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX device_federation_outbox_destination_id ON device_federation_outbox USING btree (destination, stream_id); - - --- --- Name: device_federation_outbox_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX device_federation_outbox_id ON device_federation_outbox USING btree (stream_id); - - --- --- Name: device_inbox_stream_id_user_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX device_inbox_stream_id_user_id ON device_inbox USING btree (stream_id, user_id); - - --- --- Name: device_inbox_user_stream_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX device_inbox_user_stream_id ON device_inbox USING btree (user_id, device_id, stream_id); - - --- --- Name: device_lists_outbound_last_success_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX device_lists_outbound_last_success_idx ON device_lists_outbound_last_success USING btree (destination, user_id, stream_id); - - --- --- Name: device_lists_outbound_pokes_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX device_lists_outbound_pokes_id ON device_lists_outbound_pokes USING btree (destination, stream_id); - - --- --- Name: device_lists_outbound_pokes_stream; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX device_lists_outbound_pokes_stream ON device_lists_outbound_pokes USING btree (stream_id); - - --- --- Name: device_lists_outbound_pokes_user; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX device_lists_outbound_pokes_user ON device_lists_outbound_pokes USING btree (destination, user_id); - - --- --- Name: device_lists_remote_cache_unique_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX device_lists_remote_cache_unique_id ON device_lists_remote_cache USING btree (user_id, device_id); - - --- --- Name: device_lists_remote_extremeties_unique_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX device_lists_remote_extremeties_unique_idx ON device_lists_remote_extremeties USING btree (user_id); - - --- --- Name: device_lists_stream_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX device_lists_stream_id ON device_lists_stream USING btree (stream_id, user_id); - - --- --- Name: device_lists_stream_user_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX device_lists_stream_user_id ON device_lists_stream USING btree (user_id, device_id); - - --- --- Name: e2e_room_keys_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX e2e_room_keys_idx ON e2e_room_keys USING btree (user_id, room_id, session_id); - - --- --- Name: e2e_room_keys_versions_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX e2e_room_keys_versions_idx ON e2e_room_keys_versions USING btree (user_id, version); - - --- --- Name: erased_users_user; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX erased_users_user ON erased_users USING btree (user_id); - - --- --- Name: ev_b_extrem_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ev_b_extrem_id ON event_backward_extremities USING btree (event_id); - - --- --- Name: ev_b_extrem_room; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ev_b_extrem_room ON event_backward_extremities USING btree (room_id); - - --- --- Name: ev_edges_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ev_edges_id ON event_edges USING btree (event_id); - - --- --- Name: ev_edges_prev_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ev_edges_prev_id ON event_edges USING btree (prev_event_id); - - --- --- Name: ev_extrem_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ev_extrem_id ON event_forward_extremities USING btree (event_id); - - --- --- Name: ev_extrem_room; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ev_extrem_room ON event_forward_extremities USING btree (room_id); - - --- --- Name: evauth_edges_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX evauth_edges_id ON event_auth USING btree (event_id); - - --- --- Name: event_contains_url_index; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX event_contains_url_index ON events USING btree (room_id, topological_ordering, stream_ordering) WHERE ((contains_url = true) AND (outlier = false)); - - --- --- Name: event_json_room_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX event_json_room_id ON event_json USING btree (room_id); - - --- --- Name: event_push_actions_highlights_index; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX event_push_actions_highlights_index ON event_push_actions USING btree (user_id, room_id, topological_ordering, stream_ordering) WHERE (highlight = 1); - - --- --- Name: event_push_actions_rm_tokens; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX event_push_actions_rm_tokens ON event_push_actions USING btree (user_id, room_id, topological_ordering, stream_ordering); - - --- --- Name: event_push_actions_room_id_user_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX event_push_actions_room_id_user_id ON event_push_actions USING btree (room_id, user_id); - - --- --- Name: event_push_actions_staging_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX event_push_actions_staging_id ON event_push_actions_staging USING btree (event_id); - - --- --- Name: event_push_actions_stream_ordering; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX event_push_actions_stream_ordering ON event_push_actions USING btree (stream_ordering, user_id); - - --- --- Name: event_push_actions_u_highlight; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX event_push_actions_u_highlight ON event_push_actions USING btree (user_id, stream_ordering); - - --- --- Name: event_push_summary_user_rm; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX event_push_summary_user_rm ON event_push_summary USING btree (user_id, room_id); - - --- --- Name: event_reference_hashes_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX event_reference_hashes_id ON event_reference_hashes USING btree (event_id); - - --- --- Name: event_search_ev_ridx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX event_search_ev_ridx ON event_search USING btree (room_id); - - --- --- Name: event_search_event_id_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX event_search_event_id_idx ON event_search USING btree (event_id); - - --- --- Name: event_search_fts_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX event_search_fts_idx ON event_search USING gin (vector); - - --- --- Name: event_to_state_groups_sg_index; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX event_to_state_groups_sg_index ON event_to_state_groups USING btree (state_group); - - --- --- Name: events_order_room; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX events_order_room ON events USING btree (room_id, topological_ordering, stream_ordering); - - --- --- Name: events_room_stream; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX events_room_stream ON events USING btree (room_id, stream_ordering); - - --- --- Name: events_ts; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX events_ts ON events USING btree (origin_server_ts, stream_ordering); - - --- --- Name: group_attestations_remote_g_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX group_attestations_remote_g_idx ON group_attestations_remote USING btree (group_id, user_id); - - --- --- Name: group_attestations_remote_u_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX group_attestations_remote_u_idx ON group_attestations_remote USING btree (user_id); - - --- --- Name: group_attestations_remote_v_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX group_attestations_remote_v_idx ON group_attestations_remote USING btree (valid_until_ms); - - --- --- Name: group_attestations_renewals_g_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX group_attestations_renewals_g_idx ON group_attestations_renewals USING btree (group_id, user_id); - - --- --- Name: group_attestations_renewals_u_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX group_attestations_renewals_u_idx ON group_attestations_renewals USING btree (user_id); - - --- --- Name: group_attestations_renewals_v_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX group_attestations_renewals_v_idx ON group_attestations_renewals USING btree (valid_until_ms); - - --- --- Name: group_invites_g_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX group_invites_g_idx ON group_invites USING btree (group_id, user_id); - - --- --- Name: group_invites_u_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX group_invites_u_idx ON group_invites USING btree (user_id); - - --- --- Name: group_rooms_g_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX group_rooms_g_idx ON group_rooms USING btree (group_id, room_id); - - --- --- Name: group_rooms_r_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX group_rooms_r_idx ON group_rooms USING btree (room_id); - - --- --- Name: group_summary_rooms_g_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX group_summary_rooms_g_idx ON group_summary_rooms USING btree (group_id, room_id, category_id); - - --- --- Name: group_summary_users_g_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX group_summary_users_g_idx ON group_summary_users USING btree (group_id); - - --- --- Name: group_users_g_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX group_users_g_idx ON group_users USING btree (group_id, user_id); - - --- --- Name: group_users_u_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX group_users_u_idx ON group_users USING btree (user_id); - - --- --- Name: groups_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX groups_idx ON groups USING btree (group_id); - - --- --- Name: local_group_membership_g_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX local_group_membership_g_idx ON local_group_membership USING btree (group_id); - - --- --- Name: local_group_membership_u_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX local_group_membership_u_idx ON local_group_membership USING btree (user_id, group_id); - - --- --- Name: local_invites_for_user_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX local_invites_for_user_idx ON local_invites USING btree (invitee, locally_rejected, replaced_by, room_id); - - --- --- Name: local_invites_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX local_invites_id ON local_invites USING btree (stream_id); - - --- --- Name: local_media_repository_thumbnails_media_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX local_media_repository_thumbnails_media_id ON local_media_repository_thumbnails USING btree (media_id); - - --- --- Name: local_media_repository_url_cache_by_url_download_ts; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX local_media_repository_url_cache_by_url_download_ts ON local_media_repository_url_cache USING btree (url, download_ts); - - --- --- Name: local_media_repository_url_cache_expires_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX local_media_repository_url_cache_expires_idx ON local_media_repository_url_cache USING btree (expires_ts); - - --- --- Name: local_media_repository_url_cache_media_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX local_media_repository_url_cache_media_idx ON local_media_repository_url_cache USING btree (media_id); - - --- --- Name: local_media_repository_url_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX local_media_repository_url_idx ON local_media_repository USING btree (created_ts) WHERE (url_cache IS NOT NULL); - - --- --- Name: monthly_active_users_time_stamp; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX monthly_active_users_time_stamp ON monthly_active_users USING btree ("timestamp"); - - --- --- Name: monthly_active_users_users; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX monthly_active_users_users ON monthly_active_users USING btree (user_id); - - --- --- Name: open_id_tokens_ts_valid_until_ms; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX open_id_tokens_ts_valid_until_ms ON open_id_tokens USING btree (ts_valid_until_ms); - - --- --- Name: presence_list_user_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX presence_list_user_id ON presence_list USING btree (user_id); - - --- --- Name: presence_stream_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX presence_stream_id ON presence_stream USING btree (stream_id, user_id); - - --- --- Name: presence_stream_user_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX presence_stream_user_id ON presence_stream USING btree (user_id); - - --- --- Name: public_room_index; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX public_room_index ON rooms USING btree (is_public); - - --- --- Name: public_room_list_stream_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX public_room_list_stream_idx ON public_room_list_stream USING btree (stream_id); - - --- --- Name: public_room_list_stream_rm_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX public_room_list_stream_rm_idx ON public_room_list_stream USING btree (room_id, stream_id); - - --- --- Name: push_rules_enable_user_name; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX push_rules_enable_user_name ON push_rules_enable USING btree (user_name); - - --- --- Name: push_rules_stream_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX push_rules_stream_id ON push_rules_stream USING btree (stream_id); - - --- --- Name: push_rules_stream_user_stream_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX push_rules_stream_user_stream_id ON push_rules_stream USING btree (user_id, stream_id); - - --- --- Name: push_rules_user_name; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX push_rules_user_name ON push_rules USING btree (user_name); - - --- --- Name: ratelimit_override_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX ratelimit_override_idx ON ratelimit_override USING btree (user_id); - - --- --- Name: receipts_linearized_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX receipts_linearized_id ON receipts_linearized USING btree (stream_id); - - --- --- Name: receipts_linearized_room_stream; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX receipts_linearized_room_stream ON receipts_linearized USING btree (room_id, stream_id); - - --- --- Name: receipts_linearized_user; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX receipts_linearized_user ON receipts_linearized USING btree (user_id); - - --- --- Name: received_transactions_ts; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX received_transactions_ts ON received_transactions USING btree (ts); - - --- --- Name: redactions_redacts; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX redactions_redacts ON redactions USING btree (redacts); - - --- --- Name: remote_profile_cache_time; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX remote_profile_cache_time ON remote_profile_cache USING btree (last_check); - - --- --- Name: remote_profile_cache_user_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX remote_profile_cache_user_id ON remote_profile_cache USING btree (user_id); - - --- --- Name: room_account_data_stream_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX room_account_data_stream_id ON room_account_data USING btree (user_id, stream_id); - - --- --- Name: room_alias_servers_alias; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX room_alias_servers_alias ON room_alias_servers USING btree (room_alias); - - --- --- Name: room_aliases_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX room_aliases_id ON room_aliases USING btree (room_id); - - --- --- Name: room_depth_room; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX room_depth_room ON room_depth USING btree (room_id); - - --- --- Name: room_memberships_room_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX room_memberships_room_id ON room_memberships USING btree (room_id); - - --- --- Name: room_memberships_user_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX room_memberships_user_id ON room_memberships USING btree (user_id); - - --- --- Name: room_names_room_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX room_names_room_id ON room_names USING btree (room_id); - - --- --- Name: st_extrem_keys; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX st_extrem_keys ON state_forward_extremities USING btree (room_id, type, state_key); - - --- --- Name: state_group_edges_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX state_group_edges_idx ON state_group_edges USING btree (state_group); - - --- --- Name: state_group_edges_prev_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX state_group_edges_prev_idx ON state_group_edges USING btree (prev_state_group); - - --- --- Name: state_groups_state_type_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX state_groups_state_type_idx ON state_groups_state USING btree (state_group, type, state_key); - - --- --- Name: stream_ordering_to_exterm_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX stream_ordering_to_exterm_idx ON stream_ordering_to_exterm USING btree (stream_ordering); - - --- --- Name: stream_ordering_to_exterm_rm_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX stream_ordering_to_exterm_rm_idx ON stream_ordering_to_exterm USING btree (room_id, stream_ordering); - - --- --- Name: threepid_guest_access_tokens_index; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX threepid_guest_access_tokens_index ON threepid_guest_access_tokens USING btree (medium, address); - - --- --- Name: topics_room_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX topics_room_id ON topics USING btree (room_id); - - --- --- Name: transaction_id_to_pdu_dest; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX transaction_id_to_pdu_dest ON transaction_id_to_pdu USING btree (destination); - - --- --- Name: user_daily_visits_ts_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX user_daily_visits_ts_idx ON user_daily_visits USING btree ("timestamp"); - - --- --- Name: user_daily_visits_uts_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX user_daily_visits_uts_idx ON user_daily_visits USING btree (user_id, "timestamp"); - - --- --- Name: user_directory_room_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX user_directory_room_idx ON user_directory USING btree (room_id); - - --- --- Name: user_directory_search_fts_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX user_directory_search_fts_idx ON user_directory_search USING gin (vector); - - --- --- Name: user_directory_search_user_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX user_directory_search_user_idx ON user_directory_search USING btree (user_id); - - --- --- Name: user_directory_user_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX user_directory_user_idx ON user_directory USING btree (user_id); - - --- --- Name: user_filters_by_user_id_filter_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX user_filters_by_user_id_filter_id ON user_filters USING btree (user_id, filter_id); - - --- --- Name: user_ips_device_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX user_ips_device_id ON user_ips USING btree (user_id, device_id, last_seen); - - --- --- Name: user_ips_device_unique_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX user_ips_device_unique_id ON user_ips USING btree (access_token, ip, user_agent); - - --- --- Name: user_ips_last_seen; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX user_ips_last_seen ON user_ips USING btree (user_id, last_seen); - - --- --- Name: user_ips_last_seen_only; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX user_ips_last_seen_only ON user_ips USING btree (last_seen); - - --- --- Name: user_ips_user_ip; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX user_ips_user_ip ON user_ips USING btree (user_id, access_token, ip); - - --- --- Name: user_threepids_medium_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX user_threepids_medium_address ON user_threepids USING btree (medium, address); - - --- --- Name: user_threepids_user_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX user_threepids_user_id ON user_threepids USING btree (user_id); - - --- --- Name: users_creation_ts; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX users_creation_ts ON users USING btree (creation_ts); - - --- --- Name: users_in_public_rooms_room_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX users_in_public_rooms_room_idx ON users_in_public_rooms USING btree (room_id); - - --- --- Name: users_in_public_rooms_user_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX users_in_public_rooms_user_idx ON users_in_public_rooms USING btree (user_id); - - --- --- Name: users_who_share_rooms_o_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX users_who_share_rooms_o_idx ON users_who_share_rooms USING btree (other_user_id); - - --- --- Name: users_who_share_rooms_r_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX users_who_share_rooms_r_idx ON users_who_share_rooms USING btree (room_id); - - --- --- Name: users_who_share_rooms_u_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX users_who_share_rooms_u_idx ON users_who_share_rooms USING btree (user_id, other_user_id); - - --- --- Name: application_services_regex application_services_regex_as_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY application_services_regex - ADD CONSTRAINT application_services_regex_as_id_fkey FOREIGN KEY (as_id) REFERENCES application_services(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/synapse/storage/schema/full_schemas/54/full.sql.sqlite b/synapse/storage/schema/full_schemas/54/full.sql.sqlite deleted file mode 100644 index 670e7f2b3cd8..000000000000 --- a/synapse/storage/schema/full_schemas/54/full.sql.sqlite +++ /dev/null @@ -1,1201 +0,0 @@ -CREATE TABLE application_services( - id BIGINT PRIMARY KEY, - url TEXT, - token TEXT, - hs_token TEXT, - sender TEXT, - UNIQUE(token) -); -CREATE TABLE application_services_regex( - id BIGINT PRIMARY KEY, - as_id BIGINT NOT NULL, - namespace INTEGER, - regex TEXT, - FOREIGN KEY(as_id) REFERENCES application_services(id) -); -CREATE TABLE application_services_state( - as_id TEXT PRIMARY KEY, - state VARCHAR(5), - last_txn INTEGER -); -CREATE TABLE application_services_txns( - as_id TEXT NOT NULL, - txn_id INTEGER NOT NULL, - event_ids TEXT NOT NULL, - UNIQUE(as_id, txn_id) -); -CREATE INDEX application_services_txns_id ON application_services_txns(as_id); -CREATE TABLE presence( - user_id TEXT NOT NULL, - state VARCHAR(20), - status_msg TEXT, - mtime BIGINT, - UNIQUE(user_id) -); -CREATE TABLE presence_allow_inbound( - observed_user_id TEXT NOT NULL, - observer_user_id TEXT NOT NULL, - UNIQUE(observed_user_id, observer_user_id) -); -CREATE TABLE presence_list( - user_id TEXT NOT NULL, - observed_user_id TEXT NOT NULL, - accepted BOOLEAN NOT NULL, - UNIQUE(user_id, observed_user_id) -); -CREATE INDEX presence_list_user_id ON presence_list(user_id); -CREATE TABLE users( - name TEXT, - password_hash TEXT, - creation_ts BIGINT, - admin SMALLINT DEFAULT 0 NOT NULL, - upgrade_ts BIGINT, - is_guest SMALLINT DEFAULT 0 NOT NULL, - appservice_id TEXT, - consent_version TEXT, - consent_server_notice_sent TEXT, - user_type TEXT DEFAULT NULL, - UNIQUE(name) -); -CREATE TABLE access_tokens( - id BIGINT PRIMARY KEY, - user_id TEXT NOT NULL, - device_id TEXT, - token TEXT NOT NULL, - last_used BIGINT, - UNIQUE(token) -); -CREATE TABLE user_ips( - user_id TEXT NOT NULL, - access_token TEXT NOT NULL, - device_id TEXT, - ip TEXT NOT NULL, - user_agent TEXT NOT NULL, - last_seen BIGINT NOT NULL -); -CREATE INDEX user_ips_user_ip ON user_ips(user_id, access_token, ip); -CREATE TABLE profiles( - user_id TEXT NOT NULL, - displayname TEXT, - avatar_url TEXT, - UNIQUE(user_id) -); -CREATE TABLE received_transactions( - transaction_id TEXT, - origin TEXT, - ts BIGINT, - response_code INTEGER, - response_json bytea, - has_been_referenced smallint default 0, - UNIQUE(transaction_id, origin) -); -CREATE TABLE transaction_id_to_pdu( - transaction_id INTEGER, - destination TEXT, - pdu_id TEXT, - pdu_origin TEXT, - UNIQUE(transaction_id, destination) -); -CREATE INDEX transaction_id_to_pdu_dest ON transaction_id_to_pdu(destination); -CREATE TABLE destinations( - destination TEXT PRIMARY KEY, - retry_last_ts BIGINT, - retry_interval INTEGER -); -CREATE TABLE events( - stream_ordering INTEGER PRIMARY KEY, - topological_ordering BIGINT NOT NULL, - event_id TEXT NOT NULL, - type TEXT NOT NULL, - room_id TEXT NOT NULL, - content TEXT, - unrecognized_keys TEXT, - processed BOOL NOT NULL, - outlier BOOL NOT NULL, - depth BIGINT DEFAULT 0 NOT NULL, - origin_server_ts BIGINT, - received_ts BIGINT, - sender TEXT, - contains_url BOOLEAN, - UNIQUE(event_id) -); -CREATE INDEX events_order_room ON events( - room_id, - topological_ordering, - stream_ordering -); -CREATE TABLE event_json( - event_id TEXT NOT NULL, - room_id TEXT NOT NULL, - internal_metadata TEXT NOT NULL, - json TEXT NOT NULL, - UNIQUE(event_id) -); -CREATE INDEX event_json_room_id ON event_json(room_id); -CREATE TABLE state_events( - event_id TEXT NOT NULL, - room_id TEXT NOT NULL, - type TEXT NOT NULL, - state_key TEXT NOT NULL, - prev_state TEXT, - UNIQUE(event_id) -); -CREATE TABLE current_state_events( - event_id TEXT NOT NULL, - room_id TEXT NOT NULL, - type TEXT NOT NULL, - state_key TEXT NOT NULL, - UNIQUE(event_id), - UNIQUE(room_id, type, state_key) -); -CREATE TABLE room_memberships( - event_id TEXT NOT NULL, - user_id TEXT NOT NULL, - sender TEXT NOT NULL, - room_id TEXT NOT NULL, - membership TEXT NOT NULL, - forgotten INTEGER DEFAULT 0, - display_name TEXT, - avatar_url TEXT, - UNIQUE(event_id) -); -CREATE INDEX room_memberships_room_id ON room_memberships(room_id); -CREATE INDEX room_memberships_user_id ON room_memberships(user_id); -CREATE TABLE feedback( - event_id TEXT NOT NULL, - feedback_type TEXT, - target_event_id TEXT, - sender TEXT, - room_id TEXT, - UNIQUE(event_id) -); -CREATE TABLE topics( - event_id TEXT NOT NULL, - room_id TEXT NOT NULL, - topic TEXT NOT NULL, - UNIQUE(event_id) -); -CREATE INDEX topics_room_id ON topics(room_id); -CREATE TABLE room_names( - event_id TEXT NOT NULL, - room_id TEXT NOT NULL, - name TEXT NOT NULL, - UNIQUE(event_id) -); -CREATE INDEX room_names_room_id ON room_names(room_id); -CREATE TABLE rooms( - room_id TEXT PRIMARY KEY NOT NULL, - is_public BOOL, - creator TEXT -); -CREATE TABLE room_hosts( - room_id TEXT NOT NULL, - host TEXT NOT NULL, - UNIQUE(room_id, host) -); -CREATE TABLE server_tls_certificates( - server_name TEXT, - fingerprint TEXT, - from_server TEXT, - ts_added_ms BIGINT, - tls_certificate bytea, - UNIQUE(server_name, fingerprint) -); -CREATE TABLE server_signature_keys( - server_name TEXT, - key_id TEXT, - from_server TEXT, - ts_added_ms BIGINT, - verify_key bytea, - UNIQUE(server_name, key_id) -); -CREATE TABLE rejections( - event_id TEXT NOT NULL, - reason TEXT NOT NULL, - last_check TEXT NOT NULL, - UNIQUE(event_id) -); -CREATE TABLE push_rules( - id BIGINT PRIMARY KEY, - user_name TEXT NOT NULL, - rule_id TEXT NOT NULL, - priority_class SMALLINT NOT NULL, - priority INTEGER NOT NULL DEFAULT 0, - conditions TEXT NOT NULL, - actions TEXT NOT NULL, - UNIQUE(user_name, rule_id) -); -CREATE INDEX push_rules_user_name on push_rules(user_name); -CREATE TABLE user_filters(user_id TEXT, filter_id BIGINT, filter_json bytea); -CREATE INDEX user_filters_by_user_id_filter_id ON user_filters( - user_id, - filter_id -); -CREATE TABLE push_rules_enable( - id BIGINT PRIMARY KEY, - user_name TEXT NOT NULL, - rule_id TEXT NOT NULL, - enabled SMALLINT, - UNIQUE(user_name, rule_id) -); -CREATE INDEX push_rules_enable_user_name on push_rules_enable(user_name); -CREATE TABLE event_forward_extremities( - event_id TEXT NOT NULL, - room_id TEXT NOT NULL, - UNIQUE(event_id, room_id) -); -CREATE INDEX ev_extrem_room ON event_forward_extremities(room_id); -CREATE INDEX ev_extrem_id ON event_forward_extremities(event_id); -CREATE TABLE event_backward_extremities( - event_id TEXT NOT NULL, - room_id TEXT NOT NULL, - UNIQUE(event_id, room_id) -); -CREATE INDEX ev_b_extrem_room ON event_backward_extremities(room_id); -CREATE INDEX ev_b_extrem_id ON event_backward_extremities(event_id); -CREATE TABLE event_edges( - event_id TEXT NOT NULL, - prev_event_id TEXT NOT NULL, - room_id TEXT NOT NULL, - is_state BOOL NOT NULL, - UNIQUE(event_id, prev_event_id, room_id, is_state) -); -CREATE INDEX ev_edges_id ON event_edges(event_id); -CREATE INDEX ev_edges_prev_id ON event_edges(prev_event_id); -CREATE TABLE room_depth( - room_id TEXT NOT NULL, - min_depth INTEGER NOT NULL, - UNIQUE(room_id) -); -CREATE INDEX room_depth_room ON room_depth(room_id); -CREATE TABLE event_destinations( - event_id TEXT NOT NULL, - destination TEXT NOT NULL, - delivered_ts BIGINT DEFAULT 0, - UNIQUE(event_id, destination) -); -CREATE TABLE state_forward_extremities( - event_id TEXT NOT NULL, - room_id TEXT NOT NULL, - type TEXT NOT NULL, - state_key TEXT NOT NULL, - UNIQUE(event_id, room_id) -); -CREATE INDEX st_extrem_keys ON state_forward_extremities( - room_id, - type, - state_key -); -CREATE TABLE state_groups( - id BIGINT PRIMARY KEY, - room_id TEXT NOT NULL, - event_id TEXT NOT NULL -); -CREATE TABLE state_groups_state( - state_group BIGINT NOT NULL, - room_id TEXT NOT NULL, - type TEXT NOT NULL, - state_key TEXT NOT NULL, - event_id TEXT NOT NULL -); -CREATE TABLE event_to_state_groups( - event_id TEXT NOT NULL, - state_group BIGINT NOT NULL, - UNIQUE(event_id) -); -CREATE TABLE local_media_repository( - media_id TEXT, - media_type TEXT, - media_length INTEGER, - created_ts BIGINT, - upload_name TEXT, - user_id TEXT, - quarantined_by TEXT, - url_cache TEXT, - last_access_ts BIGINT, - UNIQUE(media_id) -); -CREATE TABLE local_media_repository_thumbnails( - media_id TEXT, - thumbnail_width INTEGER, - thumbnail_height INTEGER, - thumbnail_type TEXT, - thumbnail_method TEXT, - thumbnail_length INTEGER, - UNIQUE(media_id, thumbnail_width, thumbnail_height, thumbnail_type) -); -CREATE INDEX local_media_repository_thumbnails_media_id ON local_media_repository_thumbnails( - media_id -); -CREATE TABLE remote_media_cache( - media_origin TEXT, - media_id TEXT, - media_type TEXT, - created_ts BIGINT, - upload_name TEXT, - media_length INTEGER, - filesystem_id TEXT, - last_access_ts BIGINT, - quarantined_by TEXT, - UNIQUE(media_origin, media_id) -); -CREATE TABLE remote_media_cache_thumbnails( - media_origin TEXT, - media_id TEXT, - thumbnail_width INTEGER, - thumbnail_height INTEGER, - thumbnail_method TEXT, - thumbnail_type TEXT, - thumbnail_length INTEGER, - filesystem_id TEXT, - UNIQUE(media_origin, media_id, thumbnail_width, thumbnail_height, thumbnail_type) -); -CREATE TABLE redactions( - event_id TEXT NOT NULL, - redacts TEXT NOT NULL, - UNIQUE(event_id) -); -CREATE INDEX redactions_redacts ON redactions(redacts); -CREATE TABLE room_aliases( - room_alias TEXT NOT NULL, - room_id TEXT NOT NULL, - creator TEXT, - UNIQUE(room_alias) -); -CREATE INDEX room_aliases_id ON room_aliases(room_id); -CREATE TABLE room_alias_servers( - room_alias TEXT NOT NULL, - server TEXT NOT NULL -); -CREATE INDEX room_alias_servers_alias ON room_alias_servers(room_alias); -CREATE TABLE event_content_hashes( - event_id TEXT, - algorithm TEXT, - hash bytea, - UNIQUE(event_id, algorithm) -); -CREATE TABLE event_reference_hashes( - event_id TEXT, - algorithm TEXT, - hash bytea, - UNIQUE(event_id, algorithm) -); -CREATE INDEX event_reference_hashes_id ON event_reference_hashes(event_id); -CREATE TABLE event_signatures( - event_id TEXT, - signature_name TEXT, - key_id TEXT, - signature bytea, - UNIQUE(event_id, signature_name, key_id) -); -CREATE TABLE event_edge_hashes( - event_id TEXT, - prev_event_id TEXT, - algorithm TEXT, - hash bytea, - UNIQUE(event_id, prev_event_id, algorithm) -); -CREATE TABLE IF NOT EXISTS "server_keys_json"( - server_name TEXT NOT NULL, - key_id TEXT NOT NULL, - from_server TEXT NOT NULL, - ts_added_ms BIGINT NOT NULL, - ts_valid_until_ms BIGINT NOT NULL, - key_json bytea NOT NULL, - CONSTRAINT server_keys_json_uniqueness UNIQUE(server_name, key_id, from_server) -); -CREATE TABLE e2e_device_keys_json( - user_id TEXT NOT NULL, - device_id TEXT NOT NULL, - ts_added_ms BIGINT NOT NULL, - key_json TEXT NOT NULL, - CONSTRAINT e2e_device_keys_json_uniqueness UNIQUE(user_id, device_id) -); -CREATE TABLE e2e_one_time_keys_json( - user_id TEXT NOT NULL, - device_id TEXT NOT NULL, - algorithm TEXT NOT NULL, - key_id TEXT NOT NULL, - ts_added_ms BIGINT NOT NULL, - key_json TEXT NOT NULL, - CONSTRAINT e2e_one_time_keys_json_uniqueness UNIQUE(user_id, device_id, algorithm, key_id) -); -CREATE TABLE receipts_graph( - room_id TEXT NOT NULL, - receipt_type TEXT NOT NULL, - user_id TEXT NOT NULL, - event_ids TEXT NOT NULL, - data TEXT NOT NULL, - CONSTRAINT receipts_graph_uniqueness UNIQUE(room_id, receipt_type, user_id) -); -CREATE TABLE receipts_linearized( - stream_id BIGINT NOT NULL, - room_id TEXT NOT NULL, - receipt_type TEXT NOT NULL, - user_id TEXT NOT NULL, - event_id TEXT NOT NULL, - data TEXT NOT NULL, - CONSTRAINT receipts_linearized_uniqueness UNIQUE(room_id, receipt_type, user_id) -); -CREATE INDEX receipts_linearized_id ON receipts_linearized(stream_id); -CREATE INDEX receipts_linearized_room_stream ON receipts_linearized( - room_id, - stream_id -); -CREATE TABLE IF NOT EXISTS "user_threepids"( - user_id TEXT NOT NULL, - medium TEXT NOT NULL, - address TEXT NOT NULL, - validated_at BIGINT NOT NULL, - added_at BIGINT NOT NULL, - CONSTRAINT medium_address UNIQUE(medium, address) -); -CREATE INDEX user_threepids_user_id ON user_threepids(user_id); -CREATE TABLE stats_reporting( - reported_stream_token INTEGER, - reported_time BIGINT -); -CREATE TABLE background_updates( - update_name TEXT NOT NULL, - progress_json TEXT NOT NULL, - depends_on TEXT, - CONSTRAINT background_updates_uniqueness UNIQUE(update_name) -); -CREATE VIRTUAL TABLE event_search USING fts4( - event_id, - room_id, - sender, - key, - value -) -/* event_search( - event_id, - room_id, - sender, - "key", - value -) */; -CREATE TABLE IF NOT EXISTS 'event_search_content'( - docid INTEGER PRIMARY KEY, - 'c0event_id', - 'c1room_id', - 'c2sender', - 'c3key', - 'c4value' -); -CREATE TABLE IF NOT EXISTS 'event_search_segments'(blockid INTEGER PRIMARY KEY, block BLOB); -CREATE TABLE IF NOT EXISTS 'event_search_segdir'( - level INTEGER, - idx INTEGER, - start_block INTEGER, - leaves_end_block INTEGER, - end_block INTEGER, - root BLOB, - PRIMARY KEY(level, idx) -); -CREATE TABLE IF NOT EXISTS 'event_search_docsize'(docid INTEGER PRIMARY KEY, size BLOB); -CREATE TABLE IF NOT EXISTS 'event_search_stat'(id INTEGER PRIMARY KEY, value BLOB); -CREATE TABLE guest_access( - event_id TEXT NOT NULL, - room_id TEXT NOT NULL, - guest_access TEXT NOT NULL, - UNIQUE(event_id) -); -CREATE TABLE history_visibility( - event_id TEXT NOT NULL, - room_id TEXT NOT NULL, - history_visibility TEXT NOT NULL, - UNIQUE(event_id) -); -CREATE TABLE room_tags( - user_id TEXT NOT NULL, - room_id TEXT NOT NULL, - tag TEXT NOT NULL, - content TEXT NOT NULL, - CONSTRAINT room_tag_uniqueness UNIQUE(user_id, room_id, tag) -); -CREATE TABLE room_tags_revisions( - user_id TEXT NOT NULL, - room_id TEXT NOT NULL, - stream_id BIGINT NOT NULL, - CONSTRAINT room_tag_revisions_uniqueness UNIQUE(user_id, room_id) -); -CREATE TABLE IF NOT EXISTS "account_data_max_stream_id"( - Lock CHAR(1) NOT NULL DEFAULT 'X' UNIQUE, - stream_id BIGINT NOT NULL, - CHECK(Lock='X') -); -CREATE TABLE account_data( - user_id TEXT NOT NULL, - account_data_type TEXT NOT NULL, - stream_id BIGINT NOT NULL, - content TEXT NOT NULL, - CONSTRAINT account_data_uniqueness UNIQUE(user_id, account_data_type) -); -CREATE TABLE room_account_data( - user_id TEXT NOT NULL, - room_id TEXT NOT NULL, - account_data_type TEXT NOT NULL, - stream_id BIGINT NOT NULL, - content TEXT NOT NULL, - CONSTRAINT room_account_data_uniqueness UNIQUE(user_id, room_id, account_data_type) -); -CREATE INDEX account_data_stream_id on account_data(user_id, stream_id); -CREATE INDEX room_account_data_stream_id on room_account_data( - user_id, - stream_id -); -CREATE INDEX events_ts ON events(origin_server_ts, stream_ordering); -CREATE TABLE event_push_actions( - room_id TEXT NOT NULL, - event_id TEXT NOT NULL, - user_id TEXT NOT NULL, - profile_tag VARCHAR(32), - actions TEXT NOT NULL, - topological_ordering BIGINT, - stream_ordering BIGINT, - notif SMALLINT, - highlight SMALLINT, - CONSTRAINT event_id_user_id_profile_tag_uniqueness UNIQUE(room_id, event_id, user_id, profile_tag) -); -CREATE INDEX event_push_actions_room_id_user_id on event_push_actions( - room_id, - user_id -); -CREATE INDEX events_room_stream on events(room_id, stream_ordering); -CREATE INDEX public_room_index on rooms(is_public); -CREATE INDEX receipts_linearized_user ON receipts_linearized(user_id); -CREATE INDEX event_push_actions_rm_tokens on event_push_actions( - user_id, - room_id, - topological_ordering, - stream_ordering -); -CREATE TABLE presence_stream( - stream_id BIGINT, - user_id TEXT, - state TEXT, - last_active_ts BIGINT, - last_federation_update_ts BIGINT, - last_user_sync_ts BIGINT, - status_msg TEXT, - currently_active BOOLEAN -); -CREATE INDEX presence_stream_id ON presence_stream(stream_id, user_id); -CREATE INDEX presence_stream_user_id ON presence_stream(user_id); -CREATE TABLE push_rules_stream( - stream_id BIGINT NOT NULL, - event_stream_ordering BIGINT NOT NULL, - user_id TEXT NOT NULL, - rule_id TEXT NOT NULL, - op TEXT NOT NULL, - priority_class SMALLINT, - priority INTEGER, - conditions TEXT, - actions TEXT -); -CREATE INDEX push_rules_stream_id ON push_rules_stream(stream_id); -CREATE INDEX push_rules_stream_user_stream_id on push_rules_stream( - user_id, - stream_id -); -CREATE TABLE current_state_resets( - event_stream_ordering BIGINT PRIMARY KEY NOT NULL -); -CREATE TABLE ex_outlier_stream( - event_stream_ordering BIGINT PRIMARY KEY NOT NULL, - event_id TEXT NOT NULL, - state_group BIGINT NOT NULL -); -CREATE TABLE threepid_guest_access_tokens( - medium TEXT, - address TEXT, - guest_access_token TEXT, - first_inviter TEXT -); -CREATE UNIQUE INDEX threepid_guest_access_tokens_index ON threepid_guest_access_tokens( - medium, - address -); -CREATE TABLE local_invites( - stream_id BIGINT NOT NULL, - inviter TEXT NOT NULL, - invitee TEXT NOT NULL, - event_id TEXT NOT NULL, - room_id TEXT NOT NULL, - locally_rejected TEXT, - replaced_by TEXT -); -CREATE INDEX local_invites_id ON local_invites(stream_id); -CREATE INDEX local_invites_for_user_idx ON local_invites( - invitee, - locally_rejected, - replaced_by, - room_id -); -CREATE INDEX event_push_actions_stream_ordering on event_push_actions( - stream_ordering, - user_id -); -CREATE TABLE open_id_tokens( - token TEXT NOT NULL PRIMARY KEY, - ts_valid_until_ms bigint NOT NULL, - user_id TEXT NOT NULL, - UNIQUE(token) -); -CREATE INDEX open_id_tokens_ts_valid_until_ms ON open_id_tokens( - ts_valid_until_ms -); -CREATE TABLE pusher_throttle( - pusher BIGINT NOT NULL, - room_id TEXT NOT NULL, - last_sent_ts BIGINT, - throttle_ms BIGINT, - PRIMARY KEY(pusher, room_id) -); -CREATE TABLE event_reports( - id BIGINT NOT NULL PRIMARY KEY, - received_ts BIGINT NOT NULL, - room_id TEXT NOT NULL, - event_id TEXT NOT NULL, - user_id TEXT NOT NULL, - reason TEXT, - content TEXT -); -CREATE TABLE devices( - user_id TEXT NOT NULL, - device_id TEXT NOT NULL, - display_name TEXT, - CONSTRAINT device_uniqueness UNIQUE(user_id, device_id) -); -CREATE TABLE appservice_stream_position( - Lock CHAR(1) NOT NULL DEFAULT 'X' UNIQUE, - stream_ordering BIGINT, - CHECK(Lock='X') -); -CREATE TABLE device_inbox( - user_id TEXT NOT NULL, - device_id TEXT NOT NULL, - stream_id BIGINT NOT NULL, - message_json TEXT NOT NULL -); -CREATE INDEX device_inbox_user_stream_id ON device_inbox( - user_id, - device_id, - stream_id -); -CREATE INDEX received_transactions_ts ON received_transactions(ts); -CREATE TABLE device_federation_outbox( - destination TEXT NOT NULL, - stream_id BIGINT NOT NULL, - queued_ts BIGINT NOT NULL, - messages_json TEXT NOT NULL -); -CREATE INDEX device_federation_outbox_destination_id ON device_federation_outbox( - destination, - stream_id -); -CREATE TABLE device_federation_inbox( - origin TEXT NOT NULL, - message_id TEXT NOT NULL, - received_ts BIGINT NOT NULL -); -CREATE INDEX device_federation_inbox_sender_id ON device_federation_inbox( - origin, - message_id -); -CREATE TABLE device_max_stream_id(stream_id BIGINT NOT NULL); -CREATE TABLE public_room_list_stream( - stream_id BIGINT NOT NULL, - room_id TEXT NOT NULL, - visibility BOOLEAN NOT NULL , - appservice_id TEXT, - network_id TEXT -); -CREATE INDEX public_room_list_stream_idx on public_room_list_stream(stream_id); -CREATE INDEX public_room_list_stream_rm_idx on public_room_list_stream( - room_id, - stream_id -); -CREATE TABLE state_group_edges( - state_group BIGINT NOT NULL, - prev_state_group BIGINT NOT NULL -); -CREATE INDEX state_group_edges_idx ON state_group_edges(state_group); -CREATE INDEX state_group_edges_prev_idx ON state_group_edges(prev_state_group); -CREATE TABLE stream_ordering_to_exterm( - stream_ordering BIGINT NOT NULL, - room_id TEXT NOT NULL, - event_id TEXT NOT NULL -); -CREATE INDEX stream_ordering_to_exterm_idx on stream_ordering_to_exterm( - stream_ordering -); -CREATE INDEX stream_ordering_to_exterm_rm_idx on stream_ordering_to_exterm( - room_id, - stream_ordering -); -CREATE TABLE IF NOT EXISTS "event_auth"( - event_id TEXT NOT NULL, - auth_id TEXT NOT NULL, - room_id TEXT NOT NULL -); -CREATE INDEX evauth_edges_id ON event_auth(event_id); -CREATE INDEX user_threepids_medium_address on user_threepids(medium, address); -CREATE TABLE appservice_room_list( - appservice_id TEXT NOT NULL, - network_id TEXT NOT NULL, - room_id TEXT NOT NULL -); -CREATE UNIQUE INDEX appservice_room_list_idx ON appservice_room_list( - appservice_id, - network_id, - room_id -); -CREATE INDEX device_federation_outbox_id ON device_federation_outbox( - stream_id -); -CREATE TABLE federation_stream_position( - type TEXT NOT NULL, - stream_id INTEGER NOT NULL -); -CREATE TABLE device_lists_remote_cache( - user_id TEXT NOT NULL, - device_id TEXT NOT NULL, - content TEXT NOT NULL -); -CREATE TABLE device_lists_remote_extremeties( - user_id TEXT NOT NULL, - stream_id TEXT NOT NULL -); -CREATE TABLE device_lists_stream( - stream_id BIGINT NOT NULL, - user_id TEXT NOT NULL, - device_id TEXT NOT NULL -); -CREATE INDEX device_lists_stream_id ON device_lists_stream(stream_id, user_id); -CREATE TABLE device_lists_outbound_pokes( - destination TEXT NOT NULL, - stream_id BIGINT NOT NULL, - user_id TEXT NOT NULL, - device_id TEXT NOT NULL, - sent BOOLEAN NOT NULL, - ts BIGINT NOT NULL -); -CREATE INDEX device_lists_outbound_pokes_id ON device_lists_outbound_pokes( - destination, - stream_id -); -CREATE INDEX device_lists_outbound_pokes_user ON device_lists_outbound_pokes( - destination, - user_id -); -CREATE TABLE event_push_summary( - user_id TEXT NOT NULL, - room_id TEXT NOT NULL, - notif_count BIGINT NOT NULL, - stream_ordering BIGINT NOT NULL -); -CREATE INDEX event_push_summary_user_rm ON event_push_summary( - user_id, - room_id -); -CREATE TABLE event_push_summary_stream_ordering( - Lock CHAR(1) NOT NULL DEFAULT 'X' UNIQUE, - stream_ordering BIGINT NOT NULL, - CHECK(Lock='X') -); -CREATE TABLE IF NOT EXISTS "pushers"( - id BIGINT PRIMARY KEY, - user_name TEXT NOT NULL, - access_token BIGINT DEFAULT NULL, - profile_tag TEXT NOT NULL, - kind TEXT NOT NULL, - app_id TEXT NOT NULL, - app_display_name TEXT NOT NULL, - device_display_name TEXT NOT NULL, - pushkey TEXT NOT NULL, - ts BIGINT NOT NULL, - lang TEXT, - data TEXT, - last_stream_ordering INTEGER, - last_success BIGINT, - failing_since BIGINT, - UNIQUE(app_id, pushkey, user_name) -); -CREATE INDEX device_lists_outbound_pokes_stream ON device_lists_outbound_pokes( - stream_id -); -CREATE TABLE ratelimit_override( - user_id TEXT NOT NULL, - messages_per_second BIGINT, - burst_count BIGINT -); -CREATE UNIQUE INDEX ratelimit_override_idx ON ratelimit_override(user_id); -CREATE TABLE current_state_delta_stream( - stream_id BIGINT NOT NULL, - room_id TEXT NOT NULL, - type TEXT NOT NULL, - state_key TEXT NOT NULL, - event_id TEXT, - prev_event_id TEXT -); -CREATE INDEX current_state_delta_stream_idx ON current_state_delta_stream( - stream_id -); -CREATE TABLE device_lists_outbound_last_success( - destination TEXT NOT NULL, - user_id TEXT NOT NULL, - stream_id BIGINT NOT NULL -); -CREATE INDEX device_lists_outbound_last_success_idx ON device_lists_outbound_last_success( - destination, - user_id, - stream_id -); -CREATE TABLE user_directory_stream_pos( - Lock CHAR(1) NOT NULL DEFAULT 'X' UNIQUE, - stream_id BIGINT, - CHECK(Lock='X') -); -CREATE TABLE IF NOT EXISTS "users_in_public_rooms"( - user_id TEXT NOT NULL, - room_id TEXT NOT NULL -); -CREATE VIRTUAL TABLE user_directory_search USING fts4( - user_id, - value -) -/* user_directory_search( - user_id, - value -) */; -CREATE TABLE IF NOT EXISTS 'user_directory_search_content'( - docid INTEGER PRIMARY KEY, - 'c0user_id', - 'c1value' -); -CREATE TABLE IF NOT EXISTS 'user_directory_search_segments'( - blockid INTEGER PRIMARY KEY, - block BLOB -); -CREATE TABLE IF NOT EXISTS 'user_directory_search_segdir'( - level INTEGER, - idx INTEGER, - start_block INTEGER, - leaves_end_block INTEGER, - end_block INTEGER, - root BLOB, - PRIMARY KEY(level, idx) -); -CREATE TABLE IF NOT EXISTS 'user_directory_search_docsize'( - docid INTEGER PRIMARY KEY, - size BLOB -); -CREATE TABLE IF NOT EXISTS 'user_directory_search_stat'(id INTEGER PRIMARY KEY, value BLOB); -CREATE TABLE blocked_rooms(room_id TEXT NOT NULL, user_id TEXT NOT NULL); -CREATE UNIQUE INDEX blocked_rooms_idx ON blocked_rooms(room_id); -CREATE TABLE users_who_share_rooms( - user_id TEXT NOT NULL, - other_user_id TEXT NOT NULL, - room_id TEXT NOT NULL, - share_private BOOLEAN NOT NULL -); -CREATE UNIQUE INDEX users_who_share_rooms_u_idx ON users_who_share_rooms( - user_id, - other_user_id -); -CREATE INDEX users_who_share_rooms_r_idx ON users_who_share_rooms(room_id); -CREATE INDEX users_who_share_rooms_o_idx ON users_who_share_rooms( - other_user_id -); -CREATE TABLE IF NOT EXISTS "local_media_repository_url_cache"( - url TEXT, - response_code INTEGER, - etag TEXT, - expires_ts BIGINT, - og TEXT, - media_id TEXT, - download_ts BIGINT -); -CREATE INDEX local_media_repository_url_cache_expires_idx ON local_media_repository_url_cache( - expires_ts -); -CREATE INDEX local_media_repository_url_cache_by_url_download_ts ON local_media_repository_url_cache( - url, - download_ts -); -CREATE INDEX local_media_repository_url_cache_media_idx ON local_media_repository_url_cache( - media_id -); -CREATE TABLE group_users( - group_id TEXT NOT NULL, - user_id TEXT NOT NULL, - is_admin BOOLEAN NOT NULL, - is_public BOOLEAN NOT NULL -); -CREATE TABLE group_invites(group_id TEXT NOT NULL, user_id TEXT NOT NULL); -CREATE TABLE group_rooms( - group_id TEXT NOT NULL, - room_id TEXT NOT NULL, - is_public BOOLEAN NOT NULL -); -CREATE TABLE group_summary_rooms( - group_id TEXT NOT NULL, - room_id TEXT NOT NULL, - category_id TEXT NOT NULL, - room_order BIGINT NOT NULL, - is_public BOOLEAN NOT NULL, - UNIQUE(group_id, category_id, room_id, room_order), - CHECK(room_order > 0) -); -CREATE UNIQUE INDEX group_summary_rooms_g_idx ON group_summary_rooms( - group_id, - room_id, - category_id -); -CREATE TABLE group_summary_room_categories( - group_id TEXT NOT NULL, - category_id TEXT NOT NULL, - cat_order BIGINT NOT NULL, - UNIQUE(group_id, category_id, cat_order), - CHECK(cat_order > 0) -); -CREATE TABLE group_room_categories( - group_id TEXT NOT NULL, - category_id TEXT NOT NULL, - profile TEXT NOT NULL, - is_public BOOLEAN NOT NULL, - UNIQUE(group_id, category_id) -); -CREATE TABLE group_summary_users( - group_id TEXT NOT NULL, - user_id TEXT NOT NULL, - role_id TEXT NOT NULL, - user_order BIGINT NOT NULL, - is_public BOOLEAN NOT NULL -); -CREATE INDEX group_summary_users_g_idx ON group_summary_users(group_id); -CREATE TABLE group_summary_roles( - group_id TEXT NOT NULL, - role_id TEXT NOT NULL, - role_order BIGINT NOT NULL, - UNIQUE(group_id, role_id, role_order), - CHECK(role_order > 0) -); -CREATE TABLE group_roles( - group_id TEXT NOT NULL, - role_id TEXT NOT NULL, - profile TEXT NOT NULL, - is_public BOOLEAN NOT NULL, - UNIQUE(group_id, role_id) -); -CREATE TABLE group_attestations_renewals( - group_id TEXT NOT NULL, - user_id TEXT NOT NULL, - valid_until_ms BIGINT NOT NULL -); -CREATE INDEX group_attestations_renewals_g_idx ON group_attestations_renewals( - group_id, - user_id -); -CREATE INDEX group_attestations_renewals_u_idx ON group_attestations_renewals( - user_id -); -CREATE INDEX group_attestations_renewals_v_idx ON group_attestations_renewals( - valid_until_ms -); -CREATE TABLE group_attestations_remote( - group_id TEXT NOT NULL, - user_id TEXT NOT NULL, - valid_until_ms BIGINT NOT NULL, - attestation_json TEXT NOT NULL -); -CREATE INDEX group_attestations_remote_g_idx ON group_attestations_remote( - group_id, - user_id -); -CREATE INDEX group_attestations_remote_u_idx ON group_attestations_remote( - user_id -); -CREATE INDEX group_attestations_remote_v_idx ON group_attestations_remote( - valid_until_ms -); -CREATE TABLE local_group_membership( - group_id TEXT NOT NULL, - user_id TEXT NOT NULL, - is_admin BOOLEAN NOT NULL, - membership TEXT NOT NULL, - is_publicised BOOLEAN NOT NULL, - content TEXT NOT NULL -); -CREATE INDEX local_group_membership_u_idx ON local_group_membership( - user_id, - group_id -); -CREATE INDEX local_group_membership_g_idx ON local_group_membership(group_id); -CREATE TABLE local_group_updates( - stream_id BIGINT NOT NULL, - group_id TEXT NOT NULL, - user_id TEXT NOT NULL, - type TEXT NOT NULL, - content TEXT NOT NULL -); -CREATE TABLE remote_profile_cache( - user_id TEXT NOT NULL, - displayname TEXT, - avatar_url TEXT, - last_check BIGINT NOT NULL -); -CREATE UNIQUE INDEX remote_profile_cache_user_id ON remote_profile_cache( - user_id -); -CREATE INDEX remote_profile_cache_time ON remote_profile_cache(last_check); -CREATE TABLE IF NOT EXISTS "deleted_pushers"( - stream_id BIGINT NOT NULL, - app_id TEXT NOT NULL, - pushkey TEXT NOT NULL, - user_id TEXT NOT NULL -); -CREATE INDEX deleted_pushers_stream_id ON deleted_pushers(stream_id); -CREATE TABLE IF NOT EXISTS "groups"( - group_id TEXT NOT NULL, - name TEXT, - avatar_url TEXT, - short_description TEXT, - long_description TEXT, - is_public BOOL NOT NULL , - join_policy TEXT NOT NULL DEFAULT 'invite' -); -CREATE UNIQUE INDEX groups_idx ON groups(group_id); -CREATE TABLE IF NOT EXISTS "user_directory"( - user_id TEXT NOT NULL, - room_id TEXT, - display_name TEXT, - avatar_url TEXT -); -CREATE INDEX user_directory_room_idx ON user_directory(room_id); -CREATE UNIQUE INDEX user_directory_user_idx ON user_directory(user_id); -CREATE INDEX users_in_public_rooms_room_idx ON users_in_public_rooms(room_id); -CREATE UNIQUE INDEX users_in_public_rooms_user_idx ON users_in_public_rooms( - user_id -); -CREATE TABLE event_push_actions_staging( - event_id TEXT NOT NULL, - user_id TEXT NOT NULL, - actions TEXT NOT NULL, - notif SMALLINT NOT NULL, - highlight SMALLINT NOT NULL -); -CREATE INDEX event_push_actions_staging_id ON event_push_actions_staging( - event_id -); -CREATE TABLE users_pending_deactivation(user_id TEXT NOT NULL); -CREATE UNIQUE INDEX group_invites_g_idx ON group_invites(group_id, user_id); -CREATE UNIQUE INDEX group_users_g_idx ON group_users(group_id, user_id); -CREATE INDEX group_users_u_idx ON group_users(user_id); -CREATE INDEX group_invites_u_idx ON group_invites(user_id); -CREATE UNIQUE INDEX group_rooms_g_idx ON group_rooms(group_id, room_id); -CREATE INDEX group_rooms_r_idx ON group_rooms(room_id); -CREATE TABLE user_daily_visits( - user_id TEXT NOT NULL, - device_id TEXT, - timestamp BIGINT NOT NULL -); -CREATE INDEX user_daily_visits_uts_idx ON user_daily_visits( - user_id, - timestamp -); -CREATE INDEX user_daily_visits_ts_idx ON user_daily_visits(timestamp); -CREATE TABLE erased_users(user_id TEXT NOT NULL); -CREATE UNIQUE INDEX erased_users_user ON erased_users(user_id); -CREATE TABLE monthly_active_users( - user_id TEXT NOT NULL, - timestamp BIGINT NOT NULL -); -CREATE UNIQUE INDEX monthly_active_users_users ON monthly_active_users( - user_id -); -CREATE INDEX monthly_active_users_time_stamp ON monthly_active_users( - timestamp -); -CREATE TABLE IF NOT EXISTS "e2e_room_keys_versions"( - user_id TEXT NOT NULL, - version BIGINT NOT NULL, - algorithm TEXT NOT NULL, - auth_data TEXT NOT NULL, - deleted SMALLINT DEFAULT 0 NOT NULL -); -CREATE UNIQUE INDEX e2e_room_keys_versions_idx ON e2e_room_keys_versions( - user_id, - version -); -CREATE TABLE IF NOT EXISTS "e2e_room_keys"( - user_id TEXT NOT NULL, - room_id TEXT NOT NULL, - session_id TEXT NOT NULL, - version BIGINT NOT NULL, - first_message_index INT, - forwarded_count INT, - is_verified BOOLEAN, - session_data TEXT NOT NULL -); -CREATE UNIQUE INDEX e2e_room_keys_idx ON e2e_room_keys( - user_id, - room_id, - session_id -); -CREATE INDEX access_tokens_device_id ON access_tokens(user_id, device_id); -CREATE INDEX user_ips_device_id ON user_ips(user_id, device_id, last_seen); -CREATE INDEX event_contains_url_index ON events( - room_id, - topological_ordering, - stream_ordering -); -CREATE INDEX event_push_actions_u_highlight ON event_push_actions( - user_id, - stream_ordering -); -CREATE INDEX event_push_actions_highlights_index ON event_push_actions( - user_id, - room_id, - topological_ordering, - stream_ordering -); -CREATE INDEX current_state_events_member_index ON current_state_events( - state_key -); -CREATE INDEX device_inbox_stream_id_user_id ON device_inbox( - stream_id, - user_id -); -CREATE INDEX device_lists_stream_user_id ON device_lists_stream( - user_id, - device_id -); -CREATE INDEX local_media_repository_url_idx ON local_media_repository( - created_ts -); -CREATE INDEX user_ips_last_seen ON user_ips(user_id, last_seen); -CREATE INDEX user_ips_last_seen_only ON user_ips(last_seen); -CREATE INDEX users_creation_ts ON users(creation_ts); -CREATE INDEX event_to_state_groups_sg_index ON event_to_state_groups( - state_group -); -CREATE UNIQUE INDEX device_lists_remote_cache_unique_id ON device_lists_remote_cache( - user_id, - device_id -); -CREATE UNIQUE INDEX user_ips_device_unique_id ON user_ips( - access_token, - ip, - user_agent -); -CREATE INDEX state_groups_state_type_idx ON state_groups_state( - state_group, - type, - state_key -); -CREATE UNIQUE INDEX device_lists_remote_extremeties_unique_idx ON device_lists_remote_extremeties( - user_id -); diff --git a/synapse/storage/schema/full_schemas/54/zzz-inserts.sql b/synapse/storage/schema/full_schemas/54/zzz-inserts.sql deleted file mode 100644 index df77458cb72a..000000000000 --- a/synapse/storage/schema/full_schemas/54/zzz-inserts.sql +++ /dev/null @@ -1,10 +0,0 @@ -INSERT INTO user_directory_stream_pos (stream_id) VALUES (null); - -INSERT INTO appservice_stream_position (stream_ordering) VALUES (0); - -INSERT INTO device_max_stream_id (stream_id) VALUES (0); - -INSERT INTO event_push_summary_stream_ordering (stream_ordering) VALUES (0); - -INSERT INTO federation_stream_position (type, stream_id) VALUES ('federation', -1); -INSERT INTO federation_stream_position (type, stream_id) VALUES ('events', -1); diff --git a/tests/storage/test_client_ips.py b/tests/storage/test_client_ips.py index f6802110956e..66ea83b42168 100644 --- a/tests/storage/test_client_ips.py +++ b/tests/storage/test_client_ips.py @@ -32,26 +32,63 @@ def make_homeserver(self, reactor, clock): def prepare(self, hs, reactor, clock): self.store = self.hs.get_datastore() - def test_cleanup(self): user_id = "@user:server" - self.get_success( - self.store.insert_client_ip( - user_id, "access_token1", "ip", "user_agent", "device_id" - ) - ) - self.pump(1) - self.get_success( - self.store.insert_client_ip( - user_id, "access_token2", "ip", "user_agent", "device_id" - ) - ) - self.store._update_client_ips_batch() - self.pump(10) + # Executions we've ran + executions = [] - result = self.get_success( - self.store._remove_user_ip_dupes_impl() + # SQL fetch results + results = [ + [("user1",), ("user2",)], # Initial user fetch + [ + ("A", "1", "user agent", 1234), + ("A", "1", "user agent", 1235), + ("A", "1", "user agent", 1236), + ("B", "1", "user agent", 1237), + ("B", "1", "user agent", 1238), + ], # User 1 has duplicates + [ + ("C", "2", "user agent", 1234), + ("D", "2", "user agent", 1234), + ], # User 2 does not + ] + + txn = Mock() + + def execute(sql, args=None): + executions.append((sql, args)) + + def fetchall(): + return results.pop(0) + + txn.execute = execute + txn.fetchall = fetchall + + def runInteraction(name, func, *args): + return func(txn, *args) + + self.store.runInteraction = runInteraction + + self.get_success(self.store._remove_user_ip_dupes_impl()) + + # We want five executions: + # Fetch all the users from user_ips + # Fetch user1's entries + # Delete user1's duplicates for access token A + # Delete user1's duplicates for access token B + # Fetch user2's entries + self.assertEqual(len(executions), 5) + + # First deletion is all access token As that aren't the latest + self.assertEqual(executions[2][1], ("A", "1", "user agent", 1236)) + + # Second deletion is all access token Bs that aren't the latest + self.assertEqual(executions[3][1], ("B", "1", "user agent", 1238)) + + self.assertEqual( + [x[0].split(" ")[0] for x in executions], + ["SELECT", "SELECT", "DELETE", "DELETE", "SELECT"], ) def test_insert_new_client_ip(self): From 13e2bc96a06fd8b75921283361353d07639dabad Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Wed, 9 Jan 2019 23:53:03 +1100 Subject: [PATCH 07/20] remove some stuff --- synapse/storage/prepare_database.py | 20 ++---------------- synapse/storage/schema/full_schemas/README.md | 21 ------------------- 2 files changed, 2 insertions(+), 39 deletions(-) delete mode 100644 synapse/storage/schema/full_schemas/README.md diff --git a/synapse/storage/prepare_database.py b/synapse/storage/prepare_database.py index 5155192e2504..fa36daac524d 100644 --- a/synapse/storage/prepare_database.py +++ b/synapse/storage/prepare_database.py @@ -20,8 +20,6 @@ import os import re -from synapse.storage.engines.postgres import PostgresEngine - logger = logging.getLogger(__name__) @@ -117,24 +115,13 @@ def _setup_new_database(cur, database_engine): valid_dirs = [] pattern = re.compile(r"^\d+(\.sql)?$") - - if isinstance(database_engine, PostgresEngine): - specific = "postgres" - else: - specific = "sqlite" - - specific_pattern = re.compile(r"^\d+(\.sql." + specific + r")?$") - for filename in directory_entries: - match = pattern.match(filename) or specific_pattern.match(filename) + match = pattern.match(filename) abs_path = os.path.join(current_dir, filename) if match and os.path.isdir(abs_path): ver = int(match.group(0)) if ver <= SCHEMA_VERSION: valid_dirs.append((ver, abs_path)) - elif filename == "README.md": - # Ignore the readme - pass else: logger.warn("Unexpected entry in 'full_schemas': %s", filename) @@ -149,10 +136,7 @@ def _setup_new_database(cur, database_engine): directory_entries = os.listdir(sql_dir) - for filename in sorted( - fnmatch.filter(directory_entries, "*.sql") - + fnmatch.filter(directory_entries, "*.sql." + specific) - ): + for filename in fnmatch.filter(directory_entries, "*.sql"): sql_loc = os.path.join(sql_dir, filename) logger.debug("Applying schema %s", sql_loc) executescript(cur, sql_loc) diff --git a/synapse/storage/schema/full_schemas/README.md b/synapse/storage/schema/full_schemas/README.md deleted file mode 100644 index 615d5d73327e..000000000000 --- a/synapse/storage/schema/full_schemas/README.md +++ /dev/null @@ -1,21 +0,0 @@ -Building full schema dumps -========================== - -Postgres --------- - -$ pg_dump --schema-only --no-comments --no-tablespaces --no-acl --no-owner ${DATABASE_NAME} > full.sql.postgres - -In the resulting file, delete all SET commands from the top of the file. - -SQLite ------- - -$ sqlite3 $DATABASE_FILE ".schema" > full.sql.sqlite - -Delete the CREATE statements for "schema_version", "applied_schema_deltas", and "applied_module_schemas". - -Adding Empty Values To Tables ------------------------------ - -Some tables need data added, like stream ID tables. This is done in 54/zzz-inserts.sql and should be copied to any subsequent full schemas. \ No newline at end of file From 695fb72d61a7bd13b16f1c9dcd59023834bbb2f8 Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Wed, 9 Jan 2019 23:54:27 +1100 Subject: [PATCH 08/20] remove some stuff --- MANIFEST.in | 2 -- changelog.d/{4348.feature => 4370.feature} | 0 2 files changed, 2 deletions(-) rename changelog.d/{4348.feature => 4370.feature} (100%) diff --git a/MANIFEST.in b/MANIFEST.in index 2c023fd7a453..29303cc8b57c 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -9,9 +9,7 @@ include demo/*.py include demo/*.sh recursive-include synapse/storage/schema *.sql -recursive-include synapse/storage/schema *.sql.* recursive-include synapse/storage/schema *.py -recursive-include synapse/storage/schema *.md recursive-include docs * recursive-include scripts * diff --git a/changelog.d/4348.feature b/changelog.d/4370.feature similarity index 100% rename from changelog.d/4348.feature rename to changelog.d/4370.feature From 666487d7c8a78de2c404761e2c7ebaa3ef6e245c Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Thu, 10 Jan 2019 00:28:16 +1100 Subject: [PATCH 09/20] fix things that use the inmemory index --- synapse/storage/client_ips.py | 11 +++++------ tests/storage/test_client_ips.py | 2 -- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/synapse/storage/client_ips.py b/synapse/storage/client_ips.py index 36e2bfa13dad..2e77c8cc4c50 100644 --- a/synapse/storage/client_ips.py +++ b/synapse/storage/client_ips.py @@ -143,7 +143,6 @@ def _clean(txn, user_id): for user in users: yield self.runInteraction("user_ips_clean", _clean, user[0]) - @defer.inlineCallbacks def insert_client_ip(self, user_id, access_token, ip, user_agent, device_id, now=None): @@ -238,9 +237,9 @@ def get_last_client_ip_by_device(self, user_id, device_id): ret = {(d["user_id"], d["device_id"]): d for d in res} for key in self._batch_row_update: - uid, access_token, ip = key - if uid == user_id: - user_agent, did, last_seen = self._batch_row_update[key] + access_token, ip, user_agent = key + user_id, did, last_seen = self._batch_row_update[key] + if user_id == user_id: if not device_id or did == device_id: ret[(user_id, device_id)] = { "user_id": user_id, @@ -296,9 +295,9 @@ def get_user_ip_and_agents(self, user): results = {} for key in self._batch_row_update: - uid, access_token, ip = key + access_token, ip, user_agent = key + uid, _, last_seen = self._batch_row_update[key] if uid == user_id: - user_agent, _, last_seen = self._batch_row_update[key] results[(access_token, ip)] = (user_agent, last_seen) rows = yield self._simple_select_list( diff --git a/tests/storage/test_client_ips.py b/tests/storage/test_client_ips.py index 66ea83b42168..a3ee39a6c569 100644 --- a/tests/storage/test_client_ips.py +++ b/tests/storage/test_client_ips.py @@ -33,8 +33,6 @@ def prepare(self, hs, reactor, clock): self.store = self.hs.get_datastore() def test_cleanup(self): - user_id = "@user:server" - # Executions we've ran executions = [] From ab70a813b7a5cf671f76d72ae4776a261fe95f5b Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Sat, 12 Jan 2019 03:23:25 +1100 Subject: [PATCH 10/20] try erik's method --- synapse/storage/client_ips.py | 124 ++++++++++++++++++------------- tests/storage/test_client_ips.py | 57 -------------- 2 files changed, 73 insertions(+), 108 deletions(-) diff --git a/synapse/storage/client_ips.py b/synapse/storage/client_ips.py index 2e77c8cc4c50..7ada6ad56027 100644 --- a/synapse/storage/client_ips.py +++ b/synapse/storage/client_ips.py @@ -65,6 +65,7 @@ def __init__(self, db_conn, hs): columns=["last_seen"], ) + self._dupe_remover_last_seen = 0 self.register_background_update_handler( "user_ips_remove_dupes", self._remove_user_ip_dupes, @@ -79,7 +80,7 @@ def __init__(self, db_conn, hs): unique=True, ) - # (access_token, ip, user_agent) -> (user_id, device_id, last_seen) + # (user_id, access_token, ip,) -> (user_agent, device_id, last_seen) self._batch_row_update = {} self._client_ip_looper = self._clock.looping_call( @@ -91,64 +92,85 @@ def __init__(self, db_conn, hs): @defer.inlineCallbacks def _remove_user_ip_dupes(self, progress, batch_size): - yield self._remove_user_ip_dupes_impl() - yield self._end_background_update("user_ips_remove_dupes") - defer.returnValue(1) - @defer.inlineCallbacks - def _remove_user_ip_dupes_impl(self): - - def get_users(txn): - txn.execute("SELECT DISTINCT user_id FROM user_ips;") - results = txn.fetchall() + def get_last_seen(txn): + txn.execute( + """ + SELECT last_seen FROM user_ips + WHERE last_seen > ? + ORDER BY last_seen + LIMIT 1 + OFFSET ? + """, + (self._dupe_remover_last_seen, batch_size) + ) + results = txn.fetchone() return results - users = yield self.runInteraction("user_ips_dups_get_users", get_users) + # Get a last seen that's sufficiently far away enough from the last one + last_seen = yield self.runInteraction( + "user_ips_dups_get_last_seen", get_last_seen + ) - def _clean(txn, user_id): + if not last_seen: + yield self._end_background_update("user_ips_remove_dupes") + defer.returnValue(0) + + last_seen = last_seen[0] + + def remove(txn, last_seen): txn.execute( - ( - "SELECT access_token, ip, user_agent, last_seen " - "FROM user_ips WHERE user_id = ?" - ), - (user_id,) + """ + SELECT user_id, access_token, ip, + MAX(device_id), MAX(user_agent), MAX(last_seen) + FROM ( + SELECT user_id, access_token, ip + FROM user_ips + WHERE ? <= last_seen AND last_seen < ? + ORDER BY last_seen + ) c + INNER JOIN user_ips USING (user_id, access_token, ip) + GROUP BY user_id, access_token, ip; + HAVING count(*) > 1""", + (last_seen, last_seen) ) - results = txn.fetchall() - - seen_before = set() - seen_before_latest = {} - duplicates = set() - - for i in results: - key = i[0:3] - if key not in seen_before: - seen_before.add(key) - seen_before_latest[key] = i[3] - else: - duplicates.add(key) - if seen_before_latest[key] < i[3]: - seen_before_latest[key] = i[3] - - for d in sorted(duplicates): - access_token, ip, user_agent = d + res = txn.fetchall() + + # We've got some duplicates + for i in res: + user_id, access_token, ip, device_id, user_agent, last_seen = i + + # Drop all the duplicates txn.execute( - ( - "DELETE FROM user_ips WHERE access_token IS ? AND ip IS ? " - "AND user_agent IS ? AND last_seen != ?" - ), - (access_token, ip, user_agent, seen_before_latest[d]) + """ + DELETE FROM user_ips + WHERE user_id = ? AND access_token = ? AND ip = ? + """, + (user_id, access_token, ip) ) - for user in users: - yield self.runInteraction("user_ips_clean", _clean, user[0]) + # Add in one to be the last_seen + txn.execute( + """ + INSERT INTO user_ips + (user_id, access_token, ip, device_id, user_agent, last_seen) + VALUES (?, ?, ?, ?, ?, ?) + """, + (user_id, access_token, ip, device_id, user_agent, last_seen) + ) + + yield self.runInteraction("user_ips_dups_remove", remove, last_seen) + self._dupe_remover_last_seen = last_seen + + defer.returnValue(batch_size) @defer.inlineCallbacks def insert_client_ip(self, user_id, access_token, ip, user_agent, device_id, now=None): if not now: now = int(self._clock.time_msec()) - key = (access_token, ip, user_agent) + key = (user_id, access_token, ip) try: last_seen = self.client_ip_last_seen.get(key) @@ -161,7 +183,7 @@ def insert_client_ip(self, user_id, access_token, ip, user_agent, device_id, self.client_ip_last_seen.prefill(key, now) - self._batch_row_update[key] = (user_id, device_id, now) + self._batch_row_update[key] = (user_agent, device_id, now) def _update_client_ips_batch(self): @@ -185,19 +207,19 @@ def _update_client_ips_batch_txn(self, txn, to_update): self.database_engine.lock_table(txn, "user_ips") for entry in iteritems(to_update): - (access_token, ip, user_agent), (user_id, device_id, last_seen) = entry + (user_id, access_token, ip), (user_agent, device_id, last_seen) = entry try: self._simple_upsert_txn( txn, table="user_ips", keyvalues={ + "user_id": user_id, "access_token": access_token, "ip": ip, - "user_agent": user_agent, }, values={ - "user_id": user_id, + "user_agent": user_agent, "device_id": device_id, "last_seen": last_seen, }, @@ -237,9 +259,9 @@ def get_last_client_ip_by_device(self, user_id, device_id): ret = {(d["user_id"], d["device_id"]): d for d in res} for key in self._batch_row_update: - access_token, ip, user_agent = key - user_id, did, last_seen = self._batch_row_update[key] + user_id, access_token, ip = key if user_id == user_id: + user_agent, did, last_seen = self._batch_row_update[key] if not device_id or did == device_id: ret[(user_id, device_id)] = { "user_id": user_id, @@ -295,9 +317,9 @@ def get_user_ip_and_agents(self, user): results = {} for key in self._batch_row_update: - access_token, ip, user_agent = key - uid, _, last_seen = self._batch_row_update[key] + uid, access_token, ip, = key if uid == user_id: + user_agent, _, last_seen = self._batch_row_update[key] results[(access_token, ip)] = (user_agent, last_seen) rows = yield self._simple_select_list( diff --git a/tests/storage/test_client_ips.py b/tests/storage/test_client_ips.py index a3ee39a6c569..858efe499206 100644 --- a/tests/storage/test_client_ips.py +++ b/tests/storage/test_client_ips.py @@ -32,63 +32,6 @@ def make_homeserver(self, reactor, clock): def prepare(self, hs, reactor, clock): self.store = self.hs.get_datastore() - def test_cleanup(self): - # Executions we've ran - executions = [] - - # SQL fetch results - results = [ - [("user1",), ("user2",)], # Initial user fetch - [ - ("A", "1", "user agent", 1234), - ("A", "1", "user agent", 1235), - ("A", "1", "user agent", 1236), - ("B", "1", "user agent", 1237), - ("B", "1", "user agent", 1238), - ], # User 1 has duplicates - [ - ("C", "2", "user agent", 1234), - ("D", "2", "user agent", 1234), - ], # User 2 does not - ] - - txn = Mock() - - def execute(sql, args=None): - executions.append((sql, args)) - - def fetchall(): - return results.pop(0) - - txn.execute = execute - txn.fetchall = fetchall - - def runInteraction(name, func, *args): - return func(txn, *args) - - self.store.runInteraction = runInteraction - - self.get_success(self.store._remove_user_ip_dupes_impl()) - - # We want five executions: - # Fetch all the users from user_ips - # Fetch user1's entries - # Delete user1's duplicates for access token A - # Delete user1's duplicates for access token B - # Fetch user2's entries - self.assertEqual(len(executions), 5) - - # First deletion is all access token As that aren't the latest - self.assertEqual(executions[2][1], ("A", "1", "user agent", 1236)) - - # Second deletion is all access token Bs that aren't the latest - self.assertEqual(executions[3][1], ("B", "1", "user agent", 1238)) - - self.assertEqual( - [x[0].split(" ")[0] for x in executions], - ["SELECT", "SELECT", "DELETE", "DELETE", "SELECT"], - ) - def test_insert_new_client_ip(self): self.reactor.advance(12345678) From 33389de207dad6a3822b819b316b2c3689c6fd96 Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Sat, 12 Jan 2019 03:27:11 +1100 Subject: [PATCH 11/20] update the index --- synapse/storage/client_ips.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synapse/storage/client_ips.py b/synapse/storage/client_ips.py index 7ada6ad56027..1628c8ca9a72 100644 --- a/synapse/storage/client_ips.py +++ b/synapse/storage/client_ips.py @@ -76,7 +76,7 @@ def __init__(self, db_conn, hs): "user_ips_device_unique_index", index_name="user_ips_device_unique_id", table="user_ips", - columns=["access_token", "ip", "user_agent"], + columns=["user_id", "access_token", "ip"], unique=True, ) From 28b4bd7cda3ce6fd207c14ba22a7c034ff1a21ff Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Sat, 12 Jan 2019 03:32:34 +1100 Subject: [PATCH 12/20] fix and use the progress system --- synapse/storage/client_ips.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/synapse/storage/client_ips.py b/synapse/storage/client_ips.py index 1628c8ca9a72..cff5d37bc033 100644 --- a/synapse/storage/client_ips.py +++ b/synapse/storage/client_ips.py @@ -93,6 +93,8 @@ def __init__(self, db_conn, hs): @defer.inlineCallbacks def _remove_user_ip_dupes(self, progress, batch_size): + last_seen_progress = progress.get("last_seen", 0) + def get_last_seen(txn): txn.execute( """ @@ -102,7 +104,7 @@ def get_last_seen(txn): LIMIT 1 OFFSET ? """, - (self._dupe_remover_last_seen, batch_size) + (last_seen_progress, batch_size) ) results = txn.fetchone() return results @@ -118,7 +120,7 @@ def get_last_seen(txn): last_seen = last_seen[0] - def remove(txn, last_seen): + def remove(txn, last_seen_progress, last_seen): txn.execute( """ @@ -133,7 +135,7 @@ def remove(txn, last_seen): INNER JOIN user_ips USING (user_id, access_token, ip) GROUP BY user_id, access_token, ip; HAVING count(*) > 1""", - (last_seen, last_seen) + (last_seen_progress, last_seen) ) res = txn.fetchall() @@ -160,8 +162,11 @@ def remove(txn, last_seen): (user_id, access_token, ip, device_id, user_agent, last_seen) ) - yield self.runInteraction("user_ips_dups_remove", remove, last_seen) - self._dupe_remover_last_seen = last_seen + self._background_update_progress_txn(txn, {"last_seen": last_seen}) + + yield self.runInteraction( + "user_ips_dups_remove", remove, last_seen_progress, last_seen + ) defer.returnValue(batch_size) From b88916f76977a2d32e13804bb242ef320e6114bd Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Sat, 12 Jan 2019 03:33:07 +1100 Subject: [PATCH 13/20] don't need this --- synapse/storage/client_ips.py | 1 - 1 file changed, 1 deletion(-) diff --git a/synapse/storage/client_ips.py b/synapse/storage/client_ips.py index cff5d37bc033..ba34ef925dbf 100644 --- a/synapse/storage/client_ips.py +++ b/synapse/storage/client_ips.py @@ -65,7 +65,6 @@ def __init__(self, db_conn, hs): columns=["last_seen"], ) - self._dupe_remover_last_seen = 0 self.register_background_update_handler( "user_ips_remove_dupes", self._remove_user_ip_dupes, From a33779a2449eb3f26635da7352f87476ba0a78ea Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Sat, 12 Jan 2019 03:57:25 +1100 Subject: [PATCH 14/20] add some words from erik --- synapse/storage/client_ips.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/synapse/storage/client_ips.py b/synapse/storage/client_ips.py index ba34ef925dbf..294d0da16bd5 100644 --- a/synapse/storage/client_ips.py +++ b/synapse/storage/client_ips.py @@ -120,7 +120,14 @@ def get_last_seen(txn): last_seen = last_seen[0] def remove(txn, last_seen_progress, last_seen): - + # This works by looking at all entries in the given time span, and + # then for each (user_id, access_token, ip) tuple in that range + # checking for any duplicates in the rest of the table (via a join). + # It then only returns entries which have duplicates, and the max + # last_seen across all duplicates, which can the be used to delete + # all other duplicates. + # It is efficient due to the existence of (user_id, access_token, + # ip) and (last_seen) indices. txn.execute( """ SELECT user_id, access_token, ip, From 3153b3619031dc239653515917b1910149d4b230 Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Sat, 12 Jan 2019 04:01:30 +1100 Subject: [PATCH 15/20] drop the old non-unique index --- synapse/storage/client_ips.py | 21 ++++++++++++++++++- .../schema/delta/53/user_ips_index.sql | 4 ++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/synapse/storage/client_ips.py b/synapse/storage/client_ips.py index 294d0da16bd5..dba48469f6b2 100644 --- a/synapse/storage/client_ips.py +++ b/synapse/storage/client_ips.py @@ -72,13 +72,19 @@ def __init__(self, db_conn, hs): # Register a unique index self.register_background_index_update( - "user_ips_device_unique_index", + "user_ips_user_token_ip_unique_index", index_name="user_ips_device_unique_id", table="user_ips", columns=["user_id", "access_token", "ip"], unique=True, ) + # Drop the old non-unique index + self.register_background_update_handler( + "user_ips_drop_nonunique_index", + self._remove_user_ip_nonunique, + ) + # (user_id, access_token, ip,) -> (user_agent, device_id, last_seen) self._batch_row_update = {} @@ -89,6 +95,19 @@ def __init__(self, db_conn, hs): "before", "shutdown", self._update_client_ips_batch ) + @defer.inlineCallbacks + def _remove_user_ip_nonunique(self, progress, batch_size): + def f(conn): + txn = conn.cursor() + txn.execute( + "DROP INDEX IF EXISTS user_ips_user_ip" + ) + txn.close() + + yield self.runWithConnection(f) + yield self._end_background_update("user_ips_drop_nonunique_index") + defer.returnValue(1) + @defer.inlineCallbacks def _remove_user_ip_dupes(self, progress, batch_size): diff --git a/synapse/storage/schema/delta/53/user_ips_index.sql b/synapse/storage/schema/delta/53/user_ips_index.sql index ee7fde529aa2..4ca346c1118e 100644 --- a/synapse/storage/schema/delta/53/user_ips_index.sql +++ b/synapse/storage/schema/delta/53/user_ips_index.sql @@ -20,3 +20,7 @@ INSERT INTO background_updates (update_name, progress_json) VALUES -- add a new unique index to user_ips table INSERT INTO background_updates (update_name, progress_json, depends_on) VALUES ('user_ips_device_unique_index', '{}', 'user_ips_remove_dupes'); + +-- drop the old original index +INSERT INTO background_updates (update_name, progress_json, depends_on) VALUES + ('user_ips_drop_nonunique_index', '{}', 'user_ips_device_unique_index'); \ No newline at end of file From 3d6bad0f1311c18c820cff3870955ded1427a67a Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Sat, 12 Jan 2019 04:02:36 +1100 Subject: [PATCH 16/20] changelog --- changelog.d/{4370.feature => 4370.misc} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename changelog.d/{4370.feature => 4370.misc} (100%) diff --git a/changelog.d/4370.feature b/changelog.d/4370.misc similarity index 100% rename from changelog.d/4370.feature rename to changelog.d/4370.misc From 7cbfdd18e1e1e3471910de1668fb8d3402d58a03 Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Sat, 12 Jan 2019 04:23:43 +1100 Subject: [PATCH 17/20] fix --- synapse/storage/client_ips.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/synapse/storage/client_ips.py b/synapse/storage/client_ips.py index dba48469f6b2..5880fffd3554 100644 --- a/synapse/storage/client_ips.py +++ b/synapse/storage/client_ips.py @@ -289,8 +289,8 @@ def get_last_client_ip_by_device(self, user_id, device_id): ret = {(d["user_id"], d["device_id"]): d for d in res} for key in self._batch_row_update: - user_id, access_token, ip = key - if user_id == user_id: + uid, access_token, ip = key + if uid == user_id: user_agent, did, last_seen = self._batch_row_update[key] if not device_id or did == device_id: ret[(user_id, device_id)] = { From b28f2e1e1089915d4be64ce25bae5d15ddb2d4c9 Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Sat, 12 Jan 2019 04:24:56 +1100 Subject: [PATCH 18/20] fix tests --- synapse/storage/client_ips.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/synapse/storage/client_ips.py b/synapse/storage/client_ips.py index 5880fffd3554..836a13086a1e 100644 --- a/synapse/storage/client_ips.py +++ b/synapse/storage/client_ips.py @@ -72,8 +72,8 @@ def __init__(self, db_conn, hs): # Register a unique index self.register_background_index_update( - "user_ips_user_token_ip_unique_index", - index_name="user_ips_device_unique_id", + "user_ips_device_unique_index", + index_name="user_ips_user_token_ip_unique_index", table="user_ips", columns=["user_id", "access_token", "ip"], unique=True, From 497945f39b8731771457d4a8cff345be10c9c67b Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Sat, 12 Jan 2019 05:07:17 +1100 Subject: [PATCH 19/20] fixes --- synapse/storage/client_ips.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/synapse/storage/client_ips.py b/synapse/storage/client_ips.py index 836a13086a1e..a7d527f8eaa1 100644 --- a/synapse/storage/client_ips.py +++ b/synapse/storage/client_ips.py @@ -158,7 +158,7 @@ def remove(txn, last_seen_progress, last_seen): ORDER BY last_seen ) c INNER JOIN user_ips USING (user_id, access_token, ip) - GROUP BY user_id, access_token, ip; + GROUP BY user_id, access_token, ip HAVING count(*) > 1""", (last_seen_progress, last_seen) ) @@ -187,7 +187,9 @@ def remove(txn, last_seen_progress, last_seen): (user_id, access_token, ip, device_id, user_agent, last_seen) ) - self._background_update_progress_txn(txn, {"last_seen": last_seen}) + self._background_update_progress_txn( + txn, "user_ips_dups_remove", {"last_seen": last_seen} + ) yield self.runInteraction( "user_ips_dups_remove", remove, last_seen_progress, last_seen From a2019376718392bb67b3ecfe035115f07f673c13 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Fri, 11 Jan 2019 18:27:16 +0000 Subject: [PATCH 20/20] Correctly handle the last batch. --- synapse/storage/client_ips.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/synapse/storage/client_ips.py b/synapse/storage/client_ips.py index a7d527f8eaa1..5d548f250a2b 100644 --- a/synapse/storage/client_ips.py +++ b/synapse/storage/client_ips.py @@ -133,10 +133,16 @@ def get_last_seen(txn): ) if not last_seen: - yield self._end_background_update("user_ips_remove_dupes") - defer.returnValue(0) + # If we get a None then we're reaching the end and just need to + # delete the last batch. + last = True - last_seen = last_seen[0] + # We fake not having an upper bound by using a future date, by + # just multiplying the current time by two.... + last_seen = int(self.clock.time_msec()) * 2 + else: + last = False + last_seen = last_seen[0] def remove(txn, last_seen_progress, last_seen): # This works by looking at all entries in the given time span, and @@ -188,12 +194,14 @@ def remove(txn, last_seen_progress, last_seen): ) self._background_update_progress_txn( - txn, "user_ips_dups_remove", {"last_seen": last_seen} + txn, "user_ips_remove_dupes", {"last_seen": last_seen} ) yield self.runInteraction( "user_ips_dups_remove", remove, last_seen_progress, last_seen ) + if last: + yield self._end_background_update("user_ips_remove_dupes") defer.returnValue(batch_size)