Some improvements

This commit is contained in:
Lunny Xiao 2023-07-21 23:51:34 +08:00
parent 7eb219b368
commit 175ddbe38e
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
2 changed files with 48 additions and 33 deletions

View File

@ -32,33 +32,53 @@ func (statement *Statement) writeDeleteOrder(w builder.Writer) error {
// ErrNotImplemented not implemented // ErrNotImplemented not implemented
var ErrNotImplemented = errors.New("Not implemented") var ErrNotImplemented = errors.New("Not implemented")
func (statement *Statement) writeOrderCond(orderCondWriter builder.Writer, orderSQLWriter *builder.BytesWriter, tableName string) error { func (statement *Statement) writeOrderCond(orderCondWriter *builder.BytesWriter, tableName string) error {
if orderSQLWriter.Len() > 0 { orderSQLWriter := builder.NewWriter()
switch statement.dialect.URI().DBType { if err := statement.writeDeleteOrder(orderSQLWriter); err != nil {
case schemas.POSTGRES: return err
if statement.cond.IsValid() { }
fmt.Fprintf(orderCondWriter, " AND ")
} else { if orderSQLWriter.Len() == 0 {
fmt.Fprintf(orderCondWriter, " WHERE ") return nil
} }
fmt.Fprintf(orderCondWriter, "ctid IN (SELECT ctid FROM %s%s)", tableName, orderSQLWriter.String())
orderCondWriter.Append(orderSQLWriter.Args()...) switch statement.dialect.URI().DBType {
case schemas.SQLITE: case schemas.POSTGRES:
if statement.cond.IsValid() { if statement.cond.IsValid() {
fmt.Fprintf(orderCondWriter, " AND ") if _, err := fmt.Fprint(orderCondWriter, " AND "); err != nil {
} else { return err
fmt.Fprintf(orderCondWriter, " WHERE ") }
} } else {
fmt.Fprintf(orderCondWriter, "rowid IN (SELECT rowid FROM %s%s)", tableName, orderSQLWriter.String()) if _, err := fmt.Fprint(orderCondWriter, " WHERE "); err != nil {
// TODO: how to handle delete limit on mssql? return err
case schemas.MSSQL: }
return ErrNotImplemented }
default: if _, err := fmt.Fprintf(orderCondWriter, "ctid IN (SELECT ctid FROM %s%s)", tableName, orderSQLWriter.String()); err != nil {
fmt.Fprint(orderCondWriter, orderSQLWriter.String()) return err
orderCondWriter.Append(orderSQLWriter.Args()...) }
} orderCondWriter.Append(orderSQLWriter.Args()...)
return nil
case schemas.SQLITE:
if statement.cond.IsValid() {
if _, err := fmt.Fprint(orderCondWriter, " AND "); err != nil {
return err
}
} else {
if _, err := fmt.Fprint(orderCondWriter, " WHERE "); err != nil {
return err
}
}
if _, err := fmt.Fprintf(orderCondWriter, "rowid IN (SELECT rowid FROM %s%s)", tableName, orderSQLWriter.String()); err != nil {
return err
}
orderCondWriter.Append(orderSQLWriter.Args()...)
return nil
// TODO: how to handle delete limit on mssql?
case schemas.MSSQL:
return ErrNotImplemented
default:
return utils.WriteBuilder(orderCondWriter, orderSQLWriter)
} }
return nil
} }
func (statement *Statement) WriteDelete(realSQLWriter, deleteSQLWriter *builder.BytesWriter, nowTime func(*schemas.Column) (interface{}, time.Time, error)) error { func (statement *Statement) WriteDelete(realSQLWriter, deleteSQLWriter *builder.BytesWriter, nowTime func(*schemas.Column) (interface{}, time.Time, error)) error {
@ -72,13 +92,8 @@ func (statement *Statement) WriteDelete(realSQLWriter, deleteSQLWriter *builder.
return err return err
} }
orderSQLWriter := builder.NewWriter()
if err := statement.writeDeleteOrder(orderSQLWriter); err != nil {
return err
}
orderCondWriter := builder.NewWriter() orderCondWriter := builder.NewWriter()
if err := statement.writeOrderCond(orderCondWriter, orderSQLWriter, tableName); err != nil { if err := statement.writeOrderCond(orderCondWriter, tableName); err != nil {
return err return err
} }

View File

@ -24,7 +24,7 @@ func (statement *Statement) ResetOrderBy() {
// WriteOrderBy write order by to writer // WriteOrderBy write order by to writer
func (statement *Statement) WriteOrderBy(w builder.Writer) error { func (statement *Statement) WriteOrderBy(w builder.Writer) error {
if len(statement.orderStr) > 0 { if len(statement.orderStr) > 0 {
if _, err := fmt.Fprintf(w, " ORDER BY %s", statement.orderStr); err != nil { if _, err := fmt.Fprint(w, " ORDER BY ", statement.orderStr); err != nil {
return err return err
} }
w.Append(statement.orderArgs...) w.Append(statement.orderArgs...)