diff --git a/synapse/storage/registration.py b/synapse/storage/registration.py
index e404fa72de..a6aa64f9fb 100644
--- a/synapse/storage/registration.py
+++ b/synapse/storage/registration.py
@@ -458,17 +458,27 @@ class RegistrationStore(background_updates.BackgroundUpdateStore):
@defer.inlineCallbacks
def get_user_id_by_threepid(self, medium, address):
- ret = yield self._simple_select_one(
- "user_threepids",
- {
- "medium": medium,
- "address": address
- },
- ['user_id'], True, 'get_user_id_by_threepid'
+ def f(txn):
+ sql = (
+ "SELECT user_id"
+ " FROM user_threepids"
+ " WHERE medium = ? AND LOWER(address) = LOWER(?)"
+ )
+ txn.execute(sql, (medium, address))
+ row = txn.fetchone()
+ if not row:
+ return None
+ if txn.rowcount > 1:
+ raise StoreError(500, "More than one row matched")
+ return {
+ "user_id": row[0]
+ }
+
+ res = yield self.runInteraction(
+ "get_user_id_by_threepid", f
)
- if ret:
- defer.returnValue(ret['user_id'])
- defer.returnValue(None)
+
+ defer.returnValue(res)
def user_delete_threepids(self, user_id):
return self._simple_delete(
diff --git a/synapse/storage/schema/delta/36/user_threepids_medium_address_index.sql b/synapse/storage/schema/delta/36/user_threepids_medium_address_index.sql
new file mode 100644
index 0000000000..702a872784
--- /dev/null
+++ b/synapse/storage/schema/delta/36/user_threepids_medium_address_index.sql
@@ -0,0 +1,16 @@
+/* Copyright 2016 OpenMarket 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.
+ */
+
+CREATE INDEX user_threepids_medium_address on user_threepids (medium, LOWER(address));
|