generateDeleteSQL method
FutureOr<SQL>
generateDeleteSQL(
- Transaction transaction,
- String entityName,
- String table,
- EntityMatcher matcher, {
- Object? parameters,
- List? positionalParameters,
- Map<
String, Object?> ? namedParameters,
Implementation
FutureOr<SQL> generateDeleteSQL(Transaction transaction, String entityName,
String table, EntityMatcher matcher,
{Object? parameters,
List? positionalParameters,
Map<String, Object?>? namedParameters}) {
var retDeleteSQL = _generateSQLFrom(transaction, entityName, table, matcher,
parameters: parameters,
positionalParameters: positionalParameters,
namedParameters: namedParameters,
sqlBuilder: (String from, EncodingContext context) {
var tableAlias = context.resolveEntityAlias(table);
var sql = StringBuffer();
sql.write('DELETE ');
if (dialect.acceptsOutputSyntax) {
sql.write(' OUTPUT DELETED.* ');
}
sql.write(from);
if (dialect.acceptsReturningSyntax) {
sql.write(' RETURNING "$tableAlias".*');
}
return sql.toString();
});
if (dialect.acceptsTemporaryTableForReturning &&
!dialect.acceptsOutputSyntax &&
!dialect.acceptsReturningSyntax) {
return retDeleteSQL.resolveMapped((deleteSQL) {
var conditionSQL = deleteSQL.sqlCondition;
var tableAlias = deleteSQL.tablesAliases?[table];
var tmpTable = createTemporaryTableName(table);
var q = dialect.elementQuote;
var sqlSelAll = tableAlias != null ? ' $q$tableAlias$q.* ' : '*';
var sqlAsTableAlias = tableAlias != null ? ' as $q$tableAlias$q ' : '';
var preSql = SQL(
'CREATE TEMPORARY TABLE IF NOT EXISTS $q$tmpTable$q AS ('
' SELECT $sqlSelAll FROM $q$table$q$sqlAsTableAlias WHERE $conditionSQL '
')',
positionalParameters ?? (parameters is List ? parameters : null),
namedParameters ??
(parameters is Map<String, dynamic> ? parameters : null),
deleteSQL.parametersByPlaceholder,
mainTable: tmpTable);
var posSql1 =
SQL('SELECT * FROM $q$tmpTable$q', [], {}, {}, mainTable: tmpTable);
var posSql2 =
SQL('DROP TABLE $q$tmpTable$q', [], {}, {}, mainTable: tmpTable);
deleteSQL = deleteSQL.ensureNotSharedDummy();
deleteSQL.preSQL = [preSql];
deleteSQL.posSQL = [posSql1, posSql2];
deleteSQL.posSQLReturnIndex = 0;
return deleteSQL;
});
}
return retDeleteSQL;
}