(databaseName, tableName string, uniqueKey *UniqueKey, order string)
| 757 | } |
| 758 | |
| 759 | func buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName string, uniqueKey *UniqueKey, order string) (string, error) { |
| 760 | if uniqueKey.Columns.Len() == 0 { |
| 761 | return "", fmt.Errorf("got 0 columns in BuildUniqueKeyMinMaxValuesPreparedQuery") |
| 762 | } |
| 763 | databaseName = EscapeName(databaseName) |
| 764 | tableName = EscapeName(tableName) |
| 765 | |
| 766 | uniqueKeyColumnNames := duplicateNames(uniqueKey.Columns.Names()) |
| 767 | uniqueKeyColumnOrder := make([]string, len(uniqueKeyColumnNames)) |
| 768 | for i, column := range uniqueKey.Columns.Columns() { |
| 769 | uniqueKeyColumnNames[i] = EscapeName(uniqueKeyColumnNames[i]) |
| 770 | if column.Type == EnumColumnType { |
| 771 | uniqueKeyColumnOrder[i] = fmt.Sprintf("concat(%s) %s", uniqueKeyColumnNames[i], order) |
| 772 | } else { |
| 773 | uniqueKeyColumnOrder[i] = fmt.Sprintf("%s %s", uniqueKeyColumnNames[i], order) |
| 774 | } |
| 775 | } |
| 776 | query := fmt.Sprintf(` |
| 777 | select /* gh-ost %s.%s */ %s |
| 778 | from |
| 779 | %s.%s |
| 780 | force index (%s) |
| 781 | order by |
| 782 | %s |
| 783 | limit 1`, |
| 784 | databaseName, tableName, strings.Join(uniqueKeyColumnNames, ", "), |
| 785 | databaseName, tableName, uniqueKey.Name, |
| 786 | strings.Join(uniqueKeyColumnOrder, ", "), |
| 787 | ) |
| 788 | return query, nil |
| 789 | } |
| 790 | |
| 791 | // DMLDeleteQueryBuilder can build DELETE queries for DML events. |
| 792 | // It holds the prepared query statement so it doesn't need to be recreated every time. |
no test coverage detected
searching dependent graphs…