]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
support indexing expressions and functions for the MySQL dialect 5587/head
authorRamonWill <ramonwilliams@hotmail.co.uk>
Wed, 16 Sep 2020 02:33:47 +0000 (03:33 +0100)
committerRamonWill <ramonwilliams@hotmail.co.uk>
Wed, 16 Sep 2020 02:33:47 +0000 (03:33 +0100)
doc/build/changelog/unreleased_13/5462.rst [new file with mode: 0644]
lib/sqlalchemy/dialects/mysql/base.py
test/dialect/mysql/test_compiler.py

diff --git a/doc/build/changelog/unreleased_13/5462.rst b/doc/build/changelog/unreleased_13/5462.rst
new file mode 100644 (file)
index 0000000..49c633f
--- /dev/null
@@ -0,0 +1,7 @@
+.. change::
+    :tags: mysql, usecase
+    :tickets: 5462
+
+    Adjusted the :meth:`MySQLDDLCompiler.visit_create_index` to implement
+    indexing with expressions and functions on the MySQL dialect.
+    Pull request courtesy Ramon Williams.
index 8fb4c3b4b43d5ee3c00684f096b33f3c37e9e385..2d2f2944739761e1a01a10de22602d454998f621 100644 (file)
@@ -1975,12 +1975,17 @@ class MySQLDDLCompiler(compiler.DDLCompiler):
         self._verify_index_table(index)
         preparer = self.preparer
         table = preparer.format_table(index.table)
-        columns = [
-            self.sql_compiler.process(
+
+        columns = []
+        for expr in index.expressions:
+            key_part = self.sql_compiler.process(
                 expr, include_table=False, literal_binds=True
             )
-            for expr in index.expressions
-        ]
+            if not isinstance(expr, sa_schema.Column) and not isinstance(
+                expr, elements.UnaryExpression
+            ):
+                key_part = "(%s)" % key_part
+            columns.append(key_part)
 
         name = self._prepared_index_name(index)
 
index b222431ebde558361ede8c630d9e2445b5d83065..e439c66e334a9944a7fb045fc8466ccc45ebe96f 100644 (file)
@@ -286,7 +286,40 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL):
         t1 = Table("foo", m, Column("x", Integer))
         self.assert_compile(
             schema.CreateIndex(Index("bar", t1.c.x > 5)),
-            "CREATE INDEX bar ON foo (x > 5)",
+            "CREATE INDEX bar ON foo ((x > 5))",
+        )
+
+    def test_create_index_expr_two(self):
+        m = MetaData()
+        tbl = Table("testtbl", m, Column("x", Integer), Column("y", Integer))
+        idx1 = Index("test_idx1", tbl.c.x + tbl.c.y)
+        idx2 = Index(
+            "test_idx2", tbl.c.x, tbl.c.x + tbl.c.y, tbl.c.y - tbl.c.x
+        )
+        idx3 = Index("test_idx3", tbl.c.x.desc())
+
+        self.assert_compile(
+            schema.CreateIndex(idx1),
+            "CREATE INDEX test_idx1 ON testtbl ((x + y))",
+        )
+        self.assert_compile(
+            schema.CreateIndex(idx2),
+            "CREATE INDEX test_idx2 ON testtbl (x, (x + y), (y - x))",
+        )
+
+        self.assert_compile(
+            schema.CreateIndex(idx3),
+            "CREATE INDEX test_idx3 ON testtbl (x DESC)",
+        )
+
+    def test_create_index_expr_func(self):
+        m = MetaData()
+        tbl = Table("testtbl", m, Column("data", Integer))
+        idx1 = Index("test_idx1", func.radians(tbl.c.data))
+
+        self.assert_compile(
+            schema.CreateIndex(idx1),
+            "CREATE INDEX test_idx1 ON testtbl ((radians(data)))",
         )
 
     def test_deferrable_initially_kw_not_ignored(self):