From 15336d0018319c30d270a8f148101dfdbc27ede2 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:45:08 +0000 Subject: [PATCH] fix(typed_sql): correctly escape backticks in MySQL identifiers Update the `escape` function in `mysql_dialect.dart` to escape backticks by doubling them, adhering to MySQL identifier escaping rules. This also adds a unit test in `typed_sql/test/dialect/mysql_escape_test.dart` to verify the correct behavior. Co-authored-by: jonasfj <149732+jonasfj@users.noreply.github.com> --- typed_sql/lib/src/dialect/mysql_dialect.dart | 2 +- typed_sql/test/dialect/mysql_escape_test.dart | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 typed_sql/test/dialect/mysql_escape_test.dart diff --git a/typed_sql/lib/src/dialect/mysql_dialect.dart b/typed_sql/lib/src/dialect/mysql_dialect.dart index f42d4ab4..cf0490b9 100644 --- a/typed_sql/lib/src/dialect/mysql_dialect.dart +++ b/typed_sql/lib/src/dialect/mysql_dialect.dart @@ -240,7 +240,7 @@ final class _MysqlSqlDialect extends SqlDialect { /// Example: 'my string' -> '`my string`' /// /// Throws if [name] cannot be safely escaped. -String escape(String name) => '`$name`'; // TODO: escape ` +String escape(String name) => '`${name.replaceAll('`', '``')}`'; abstract class SqlContext { String addParameter(Object? value); diff --git a/typed_sql/test/dialect/mysql_escape_test.dart b/typed_sql/test/dialect/mysql_escape_test.dart new file mode 100644 index 00000000..3b930b28 --- /dev/null +++ b/typed_sql/test/dialect/mysql_escape_test.dart @@ -0,0 +1,18 @@ +import 'package:test/test.dart'; +import 'package:typed_sql/src/dialect/mysql_dialect.dart'; + +void main() { + group('MySQL escape', () { + test('simple name', () { + expect(escape('my_table'), '`my_table`'); + }); + + test('name with backtick', () { + expect(escape('my`table'), '`my``table`'); + }); + + test('multiple backticks', () { + expect(escape('`a``b`'), '```a````b```'); + }); + }); +}