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;
}