Skip to content

Commit

Permalink
0004996: Table PK column order mismatch with column order can cause
Browse files Browse the repository at this point in the history
errors
  • Loading branch information
erilong committed May 21, 2021
1 parent b04e267 commit 60a4b73
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 15 deletions.
Expand Up @@ -243,8 +243,8 @@ public List<IModelChange> compareTables(Database sourceModel, Table sourceTable,
}
}

Column[] sourcePK = sourceTable.getPrimaryKeyColumns();
Column[] targetPK = targetTable.getPrimaryKeyColumns();
Column[] sourcePK = sourceTable.getPrimaryKeyColumnsInIndexOrder();
Column[] targetPK = targetTable.getPrimaryKeyColumnsInIndexOrder();

if ((sourcePK.length == 0) && (targetPK.length > 0)) {
if (log.isDebugEnabled()) {
Expand Down
29 changes: 20 additions & 9 deletions symmetric-db/src/main/java/org/jumpmind/db/model/Table.java
Expand Up @@ -32,7 +32,6 @@
import java.util.ListIterator;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.EqualsBuilder;
Expand All @@ -51,6 +50,8 @@ public class Table implements Serializable, Cloneable, Comparable<Table> {
/** Unique ID for serialization purposes. */
private static final long serialVersionUID = -5541154961302342608L;

private static final ColumnPkSequenceComparator columnPkSequenceComparator = new ColumnPkSequenceComparator();

private String oldCatalog = null;

private String oldSchema = null;
Expand Down Expand Up @@ -840,8 +841,6 @@ public List<Column> getPrimaryKeyColumnsAsList() {
}
}
}
selectedColumns = selectedColumns.stream().sorted((c1, c2) ->
c1.getPrimaryKeySequence() - c2.getPrimaryKeySequence()).collect(Collectors.toList());
return selectedColumns;
} else {
return new ArrayList<Column>(0);
Expand All @@ -858,6 +857,12 @@ public Column[] getPrimaryKeyColumns() {
return pkColumns.toArray(new Column[pkColumns.size()]);
}

public Column[] getPrimaryKeyColumnsInIndexOrder() {
List<Column> pkColumns = getPrimaryKeyColumnsAsList();
Collections.sort(pkColumns, columnPkSequenceComparator);
return pkColumns.toArray(new Column[pkColumns.size()]);
}

/**
* Returns the columns in this table that are not a PK.
*
Expand Down Expand Up @@ -1493,11 +1498,17 @@ public void setCompressionType(CompressionTypes compressionType) {
this.compressionType = compressionType;
}

public static void main(String[] args) {
String result = escapeColumnNameForCsv("\\What, \"");
String result2 = escapeColumnNameForCsv("a_normal_column");
System.out.println(result);
System.out.println(result2);
static class ColumnPkSequenceComparator implements Comparator<Column> {
@Override
public int compare(Column o1, Column o2) {
if (o1 != null && o2 != null) {
return Integer.compare(o1.getPrimaryKeySequence(), o2.getPrimaryKeySequence());
} else if (o1 == null && o2 != null) {
return -1;
} else if (o1 != null && o2 == null) {
return 1;
}
return 0;
}
}

}
Expand Up @@ -1227,7 +1227,7 @@ protected void createTable(Table table, StringBuilder ddl, boolean temporary, bo
}

if (!databaseInfo.isPrimaryKeyEmbedded()) {
writeExternalPrimaryKeysCreateStmt(table, table.getPrimaryKeyColumns(), ddl);
writeExternalPrimaryKeysCreateStmt(table, table.getPrimaryKeyColumnsInIndexOrder(), ddl);
}
}

Expand Down Expand Up @@ -2170,7 +2170,7 @@ public String getConstraintName(String prefix, Table table, String secondPart, S
* The table
*/
protected void writeEmbeddedPrimaryKeysStmt(Table table, StringBuilder ddl) {
Column[] primaryKeyColumns = table.getPrimaryKeyColumns();
Column[] primaryKeyColumns = table.getPrimaryKeyColumnsInIndexOrder();

if ((primaryKeyColumns.length > 0) && shouldGeneratePrimaryKeys(primaryKeyColumns)) {
printStartOfEmbeddedStatement(ddl);
Expand Down
Expand Up @@ -339,7 +339,7 @@ protected boolean writeAlterColumnDataTypeToBigInt(ColumnDataTypeChange change,
if (column.isPrimaryKey()) {
writeTableAlterStmt(change.getChangedTable(), ddl);
ddl.append(" ADD ");
writePrimaryKeyStmt(table, table.getPrimaryKeyColumns(), ddl);
writePrimaryKeyStmt(table, table.getPrimaryKeyColumnsInIndexOrder(), ddl);
printEndOfStatement(ddl);
}

Expand Down
Expand Up @@ -399,7 +399,7 @@ protected void processChanges(Database currentModel, Database desiredModel,
Table table = ((ColumnChange) change).getChangedTable();

if (column.isPrimaryKey() && !removedPKs.contains(table)) {
Column[] pk = table.getPrimaryKeyColumns();
Column[] pk = table.getPrimaryKeyColumnsInIndexOrder();

additionalChanges.add(new RemovePrimaryKeyChange(table, pk));
additionalChanges.add(new AddPrimaryKeyChange(table, pk));
Expand Down

0 comments on commit 60a4b73

Please sign in to comment.