summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/dialects/mssql
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2020-06-01 19:43:04 +0000
committerGerrit Code Review <gerrit@bbpush.zzzcomputing.com>2020-06-01 19:43:04 +0000
commit1287853bf59a3e50b0a518d4410ff60305058131 (patch)
treeeb525241420c5e919025550cdfdf7fb6d3f47181 /lib/sqlalchemy/dialects/mssql
parenta31a07ddad1812072511ee69b4e95be099330804 (diff)
parenta7a19f292451e10aef489d87df27be7f58f831a8 (diff)
downloadsqlalchemy-1287853bf59a3e50b0a518d4410ff60305058131.tar.gz
Merge "Support multiple dotted sections in mssql schema names"
Diffstat (limited to 'lib/sqlalchemy/dialects/mssql')
-rw-r--r--lib/sqlalchemy/dialects/mssql/base.py44
1 files changed, 35 insertions, 9 deletions
diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py
index 9a38a7881..c35ab2880 100644
--- a/lib/sqlalchemy/dialects/mssql/base.py
+++ b/lib/sqlalchemy/dialects/mssql/base.py
@@ -2314,8 +2314,7 @@ def _switch_db(dbname, connection, fn, *arg, **kw):
current_db = connection.exec_driver_sql("select db_name()").scalar()
if current_db != dbname:
connection.exec_driver_sql(
- "use %s"
- % connection.dialect.identifier_preparer.quote_schema(dbname)
+ "use %s" % connection.dialect.identifier_preparer.quote(dbname)
)
try:
return fn(*arg, **kw)
@@ -2323,9 +2322,7 @@ def _switch_db(dbname, connection, fn, *arg, **kw):
if dbname and current_db != dbname:
connection.exec_driver_sql(
"use %s"
- % connection.dialect.identifier_preparer.quote_schema(
- current_db
- )
+ % connection.dialect.identifier_preparer.quote(current_db)
)
@@ -2338,33 +2335,62 @@ def _owner_plus_db(dialect, schema):
return None, schema
+_memoized_schema = util.LRUCache()
+
+
def _schema_elements(schema):
if isinstance(schema, quoted_name) and schema.quote:
return None, schema
+ if schema in _memoized_schema:
+ return _memoized_schema[schema]
+
+ # tests for this function are in:
+ # test/dialect/mssql/test_reflection.py ->
+ # OwnerPlusDBTest.test_owner_database_pairs
+ # test/dialect/mssql/test_compiler.py -> test_force_schema_*
+ # test/dialect/mssql/test_compiler.py -> test_schema_many_tokens_*
+ #
+
push = []
symbol = ""
bracket = False
+ has_brackets = False
for token in re.split(r"(\[|\]|\.)", schema):
if not token:
continue
if token == "[":
bracket = True
+ has_brackets = True
elif token == "]":
bracket = False
elif not bracket and token == ".":
- push.append(symbol)
+ if has_brackets:
+ push.append("[%s]" % symbol)
+ else:
+ push.append(symbol)
symbol = ""
+ has_brackets = False
else:
symbol += token
if symbol:
push.append(symbol)
if len(push) > 1:
- return push[0], "".join(push[1:])
+ dbname, owner = ".".join(push[0:-1]), push[-1]
+
+ # test for internal brackets
+ if re.match(r".*\].*\[.*", dbname[1:-1]):
+ dbname = quoted_name(dbname, quote=False)
+ else:
+ dbname = dbname.lstrip("[").rstrip("]")
+
elif len(push):
- return None, push[0]
+ dbname, owner = None, push[0]
else:
- return None, None
+ dbname, owner = None, None
+
+ _memoized_schema[schema] = dbname, owner
+ return dbname, owner
class MSDialect(default.DefaultDialect):