--- /dev/null
+.. change::
+ :tags: bug, mysql
+ :tickets: 11870
+
+ Fixed issue in mariadbconnector dialect where query string arguments that
+ weren't checked integer or boolean arguments would be ignored, such as
+ string arguments like ``unix_socket``, etc. As part of this change, the
+ argument parsing for particular elements such as ``client_flags``,
+ ``compress``, ``local_infile`` has been made more consistent across all
+ MySQL / MariaDB dialect which accept each argument. Pull request courtesy
+ Tobias Alex-Petersen.
+
util.coerce_kw_type(opts, "allow_local_infile", bool)
util.coerce_kw_type(opts, "autocommit", bool)
util.coerce_kw_type(opts, "buffered", bool)
+ util.coerce_kw_type(opts, "client_flag", int)
util.coerce_kw_type(opts, "compress", bool)
util.coerce_kw_type(opts, "connection_timeout", int)
util.coerce_kw_type(opts, "connect_timeout", int)
util.coerce_kw_type(opts, "read_timeout", int)
util.coerce_kw_type(opts, "write_timeout", int)
util.coerce_kw_type(opts, "client_flag", int)
- util.coerce_kw_type(opts, "local_infile", int)
+ util.coerce_kw_type(opts, "local_infile", bool)
# Note: using either of the below will cause all strings to be
# returned as Unicode, both in raw SQL operations and with column
# types like String and MSString.
("read_timeout", 30),
("write_timeout", 30),
("client_flag", 1234),
- ("local_infile", 1234),
+ ("local_infile", 1),
+ ("local_infile", True),
+ ("local_infile", False),
("use_unicode", False),
("charset", "hello"),
+ ("unix_socket", "somesocket"),
+ argnames="kwarg, value",
)
- def test_normal_arguments_mysqldb(self, kwarg, value):
- from sqlalchemy.dialects.mysql import mysqldb
+ @testing.combinations(
+ ("mysql+mysqldb", ()),
+ ("mysql+mariadbconnector", {"use_unicode", "charset"}),
+ ("mariadb+mariadbconnector", {"use_unicode", "charset"}),
+ ("mysql+pymysql", ()),
+ (
+ "mysql+mysqlconnector",
+ {"read_timeout", "write_timeout", "local_infile"},
+ ),
+ argnames="dialect_name,skip",
+ )
+ def test_query_arguments(self, kwarg, value, dialect_name, skip):
- dialect = mysqldb.dialect()
- connect_args = dialect.create_connect_args(
- make_url(
- "mysql+mysqldb://scott:tiger@localhost:3306/test"
- "?%s=%s" % (kwarg, value)
- )
+ if kwarg in skip:
+ return
+
+ url_value = {True: "true", False: "false"}.get(value, value)
+
+ url = make_url(
+ f"{dialect_name}://scott:tiger@"
+ f"localhost:3306/test?{kwarg}={url_value}"
)
+ dialect = url.get_dialect()()
+
+ connect_args = dialect.create_connect_args(url)
eq_(connect_args[1][kwarg], value)
def test_mysqlconnector_buffered_arg(self):
[
"mysql+mysqldb",
"mysql+pymysql",
+ "mysql+mariadbconnector",
"mariadb+mysqldb",
"mariadb+pymysql",
+ "mariadb+mariadbconnector",
]
)
def test_random_arg(self):