generateDeleteSQL method

FutureOr<SQL> generateDeleteSQL(
  1. Transaction transaction,
  2. String entityName,
  3. String table,
  4. EntityMatcher matcher, {
  5. Object? parameters,
  6. List? positionalParameters,
  7. 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.preSQL = [preSql];
      deleteSQL.posSQL = [posSql1, posSql2];
      deleteSQL.posSQLReturnIndex = 0;

      return deleteSQL;
    });
  }

  return retDeleteSQL;
}