diff --git a/drift/lib/sqlite_keywords.dart b/drift/lib/sqlite_keywords.dart index a3b44f46..d080f895 100644 --- a/drift/lib/sqlite_keywords.dart +++ b/drift/lib/sqlite_keywords.dart @@ -393,6 +393,8 @@ String escapeIfNeeded(String s, [SqlDialect dialect = SqlDialect.sqlite]) { isKeyword |= additionalMariaDBKeywords.contains(inUpperCase); } - if (isKeyword || _notInKeyword.hasMatch(s)) return '"$s"'; + if (isKeyword || _notInKeyword.hasMatch(s)) { + return dialect == SqlDialect.mariadb ? '`$s`' : '"$s"'; + } return s; } diff --git a/drift/lib/src/dsl/columns.dart b/drift/lib/src/dsl/columns.dart index 55f4b1fe..24d6a040 100644 --- a/drift/lib/src/dsl/columns.dart +++ b/drift/lib/src/dsl/columns.dart @@ -43,7 +43,7 @@ abstract class Column extends Expression { /// In the past, this getter only used to add double-quotes when that is /// really needed (for instance because [name] is also a reserved keyword). /// For performance reasons, we unconditionally escape names now. - String get escapedName => '"$name"'; + String get escapedName => '`$name`'; // mariadb backtick escape DOT NOT MERGE } /// A column that stores int values. diff --git a/drift/lib/src/runtime/query_builder/generation_context.dart b/drift/lib/src/runtime/query_builder/generation_context.dart index 62da10be..851a1702 100644 --- a/drift/lib/src/runtime/query_builder/generation_context.dart +++ b/drift/lib/src/runtime/query_builder/generation_context.dart @@ -87,6 +87,8 @@ class GenerationContext { void writeWhitespace() => buffer.write(' '); /// Turns [columnName] into a safe SQL identifier by wrapping it in double - /// quotes. - String identifier(String columnName) => '"$columnName"'; + /// quotes, or backticks depending on the dialect. + String identifier(String columnName) { + return dialect == SqlDialect.mariadb ? '`$columnName`' : '"$columnName"'; + } } diff --git a/drift/lib/src/runtime/query_builder/schema/entities.dart b/drift/lib/src/runtime/query_builder/schema/entities.dart index 11542420..c9808bb4 100644 --- a/drift/lib/src/runtime/query_builder/schema/entities.dart +++ b/drift/lib/src/runtime/query_builder/schema/entities.dart @@ -147,10 +147,13 @@ extension NameWithAlias on ResultSetImplementation { /// can be used in select statements, as it returns something like "users u" /// for a table called users that has been aliased as "u". String get tableWithAlias { + var dialect = attachedDatabase.executor.dialect; if (aliasedName == entityName) { - return '"$entityName"'; + return dialect == SqlDialect.mariadb ? '`$entityName`' : '"$entityName"'; } else { - return '"$entityName" "$aliasedName"'; + return dialect == SqlDialect.mariadb + ? '`$entityName` `$aliasedName`' + : '"$entityName" "$aliasedName"'; } } } diff --git a/drift_dev/lib/src/writer/utils/column_constraints.dart b/drift_dev/lib/src/writer/utils/column_constraints.dart index d3768f29..5761e93b 100644 --- a/drift_dev/lib/src/writer/utils/column_constraints.dart +++ b/drift_dev/lib/src/writer/utils/column_constraints.dart @@ -73,9 +73,11 @@ Map defaultConstraints(DriftColumn column) { } if (column.sqlType == DriftSqlType.bool) { - final name = '"${column.nameInSql}"'; + final name = column.nameInSql; dialectSpecificConstraints[SqlDialect.sqlite]! - .add('CHECK ($name IN (0, 1))'); + .add('CHECK ("$name" IN (0, 1))'); + dialectSpecificConstraints[SqlDialect.mariadb]! + .add('CHECK (`$name` IN (0, 1))'); } for (final constraints in dialectSpecificConstraints.values) {