IDEMPIERE-5943 Implement table partitioning support (#2203)
* IDEMPIERE-5943 Implement table partitioning support - Fix issues with view and functional index * IDEMPIERE-5943 Implement table partitioning support - fix compatibility issue with PostgreSQL 16.1
This commit is contained in:
parent
e5eebba4a6
commit
54018821f1
|
@ -79,9 +79,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
private boolean renameOriginalTable(MTable table, String trxName, ProcessInfo processInfo) {
|
private boolean renameOriginalTable(MTable table, String trxName, ProcessInfo processInfo) {
|
||||||
StringBuilder sql = new StringBuilder();
|
StringBuilder sql = new StringBuilder();
|
||||||
sql.append("ALTER TABLE ").append(table.getTableName()).append(" RENAME TO ").append(getDefaultPartitionName(table));
|
sql.append("ALTER TABLE ").append(table.getTableName()).append(" RENAME TO ").append(getDefaultPartitionName(table));
|
||||||
int no = DB.executeUpdateEx(sql.toString(), trxName);
|
DB.executeUpdateEx(sql.toString(), trxName);
|
||||||
if (processInfo != null)
|
if (processInfo != null)
|
||||||
processInfo.addLog(0, null, null, no + " " + sql.toString());
|
processInfo.addLog(0, null, null, sql.toString());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,9 +127,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
StringBuilder alterStmt = new StringBuilder();
|
StringBuilder alterStmt = new StringBuilder();
|
||||||
alterStmt.append("ALTER TABLE ").append(getDefaultPartitionName(table)).append(" ");
|
alterStmt.append("ALTER TABLE ").append(getDefaultPartitionName(table)).append(" ");
|
||||||
alterStmt.append("DROP CONSTRAINT ").append(constraint_name).append(" CASCADE");
|
alterStmt.append("DROP CONSTRAINT ").append(constraint_name).append(" CASCADE");
|
||||||
int no = DB.executeUpdateEx(alterStmt.toString(), trxName);
|
DB.executeUpdateEx(alterStmt.toString(), trxName);
|
||||||
if (pi != null)
|
if (pi != null)
|
||||||
pi.addLog(0, null, null, no + " " + alterStmt.toString());
|
pi.addLog(0, null, null, alterStmt.toString());
|
||||||
|
|
||||||
List<String> lowerCasePartitionKeyColumnNames = new ArrayList<String>();
|
List<String> lowerCasePartitionKeyColumnNames = new ArrayList<String>();
|
||||||
for (String partitionKeyColumnName : partitionKeyColumnNames)
|
for (String partitionKeyColumnName : partitionKeyColumnNames)
|
||||||
|
@ -149,9 +149,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
for (int x = 0; x < lowerCasePartitionKeyColumnNames.size(); x++)
|
for (int x = 0; x < lowerCasePartitionKeyColumnNames.size(); x++)
|
||||||
alterStmt.append(", ").append(lowerCasePartitionKeyColumnNames.get(x));
|
alterStmt.append(", ").append(lowerCasePartitionKeyColumnNames.get(x));
|
||||||
alterStmt.append(")");
|
alterStmt.append(")");
|
||||||
no = DB.executeUpdateEx(alterStmt.toString(), trxName);
|
DB.executeUpdateEx(alterStmt.toString(), trxName);
|
||||||
if (pi != null)
|
if (pi != null)
|
||||||
pi.addLog(0, null, null, no + " " + alterStmt.toString());
|
pi.addLog(0, null, null, alterStmt.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -178,9 +178,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
alterStmt.append("ALTER TABLE ").append(table.getTableName()).append(" ");
|
alterStmt.append("ALTER TABLE ").append(table.getTableName()).append(" ");
|
||||||
alterStmt.append("ADD CONSTRAINT ").append(constraint_name).append(" ");
|
alterStmt.append("ADD CONSTRAINT ").append(constraint_name).append(" ");
|
||||||
alterStmt.append(constraint_definition);
|
alterStmt.append(constraint_definition);
|
||||||
int no = DB.executeUpdateEx(alterStmt.toString(), trxName);
|
DB.executeUpdateEx(alterStmt.toString(), trxName);
|
||||||
if (pi != null)
|
if (pi != null)
|
||||||
pi.addLog(0, null, null, no + " " + alterStmt.toString());
|
pi.addLog(0, null, null, alterStmt.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -201,45 +201,25 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
private boolean migrateDBIndexes(MTable table, String trxName, ProcessInfo pi) {
|
private boolean migrateDBIndexes(MTable table, String trxName, ProcessInfo pi) {
|
||||||
String indexs =
|
String indexs =
|
||||||
"""
|
"""
|
||||||
select indexname
|
select indexname, indexdef
|
||||||
from pg_indexes
|
from pg_indexes
|
||||||
where schemaname='adempiere'
|
where schemaname='adempiere'
|
||||||
and tablename=?;
|
and tablename=?;
|
||||||
""";
|
""";
|
||||||
|
|
||||||
String sql =
|
Map<String, String> indexMap = new HashMap<String, String>();
|
||||||
"""
|
Map<String, String> uniqueMap = new HashMap<String, String>();
|
||||||
select a.attname, i.indisunique
|
|
||||||
from pg_index i
|
|
||||||
join pg_attribute a on (a.attrelid=i.indexrelid)
|
|
||||||
where i.indrelid::regclass = ?::regclass
|
|
||||||
and i.indexrelid::regclass = ?::regclass
|
|
||||||
order by a.attnum;
|
|
||||||
""";
|
|
||||||
|
|
||||||
Map<String, List<String>> indexMap = new HashMap<String, List<String>>();
|
|
||||||
Map<String, List<String>> uniqueMap = new HashMap<String, List<String>>();
|
|
||||||
try (PreparedStatement stmt = DB.prepareStatement(indexs, trxName)) {
|
try (PreparedStatement stmt = DB.prepareStatement(indexs, trxName)) {
|
||||||
stmt.setString(1, getDefaultPartitionName(table).toLowerCase());
|
stmt.setString(1, getDefaultPartitionName(table).toLowerCase());
|
||||||
ResultSet rs = stmt.executeQuery();
|
ResultSet rs = stmt.executeQuery();
|
||||||
while(rs.next()) {
|
while(rs.next()) {
|
||||||
String indexName = rs.getString(1);
|
String indexName = rs.getString(1);
|
||||||
boolean unique = false;
|
String indexdef = rs.getString(2);
|
||||||
List<String> columns = new ArrayList<String>();
|
boolean unique = indexdef.contains("UNIQUE INDEX");
|
||||||
try(PreparedStatement stmt1 = DB.prepareStatement(sql, trxName)) {
|
|
||||||
stmt1.setString(1, getDefaultPartitionName(table).toLowerCase());
|
|
||||||
stmt1.setString(2, indexName);
|
|
||||||
ResultSet rs1 = stmt1.executeQuery();
|
|
||||||
while(rs1.next()) {
|
|
||||||
String columnName = rs1.getString(1);
|
|
||||||
unique = rs1.getBoolean(2);
|
|
||||||
columns.add(columnName.toLowerCase());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (unique)
|
if (unique)
|
||||||
uniqueMap.put(indexName, columns);
|
uniqueMap.put(indexName, indexdef);
|
||||||
else
|
else
|
||||||
indexMap.put(indexName, columns);
|
indexMap.put(indexName, indexdef);
|
||||||
}
|
}
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
throw new DBException(e);
|
throw new DBException(e);
|
||||||
|
@ -253,22 +233,19 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
//unique index must include partition key column
|
//unique index must include partition key column
|
||||||
List<String> columns = uniqueMap.get(indexName);
|
String indexdef = uniqueMap.get(indexName);
|
||||||
for(String partitionKey : partitionKeyColumnNames) {
|
for(String partitionKey : partitionKeyColumnNames) {
|
||||||
if (!columns.contains(partitionKey.toLowerCase()))
|
if (!indexdef.contains(partitionKey.toLowerCase()+",") && !indexdef.contains(partitionKey.toLowerCase()+")"))
|
||||||
columns.add(partitionKey.toLowerCase());
|
indexdef = indexdef.substring(0, indexdef.length()-1)+", "+partitionKey.toLowerCase()+")";
|
||||||
}
|
}
|
||||||
StringBuilder alter = new StringBuilder("DROP INDEX ").append(indexName);
|
StringBuilder alter = new StringBuilder("DROP INDEX ").append(indexName);
|
||||||
DB.executeUpdateEx(alter.toString(), trxName);
|
DB.executeUpdateEx(alter.toString(), trxName);
|
||||||
alter = new StringBuilder("CREATE UNIQUE INDEX ")
|
if (pi != null)
|
||||||
.append(indexName)
|
pi.addLog(0, null, null, alter.toString());
|
||||||
.append(" ")
|
indexdef = indexdef.replace(" ON adempiere."+getDefaultPartitionName(table).toLowerCase()+" ", " ON adempiere."+table.getTableName().toLowerCase()+" ");
|
||||||
.append("ON ")
|
DB.executeUpdateEx(indexdef, trxName);
|
||||||
.append(table.getTableName())
|
if (pi != null)
|
||||||
.append("(")
|
pi.addLog(0, null, null, indexdef);
|
||||||
.append(String.join(",", columns))
|
|
||||||
.append(")");
|
|
||||||
DB.executeUpdateEx(alter.toString(), trxName);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(String indexName : indexMap.keySet()) {
|
for(String indexName : indexMap.keySet()) {
|
||||||
|
@ -277,18 +254,15 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
if (conindid != null && conindid.equalsIgnoreCase(indexName))
|
if (conindid != null && conindid.equalsIgnoreCase(indexName))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
List<String> columns = indexMap.get(indexName);
|
String indexdef = indexMap.get(indexName);
|
||||||
StringBuilder alter = new StringBuilder("DROP INDEX ").append(indexName);
|
StringBuilder alter = new StringBuilder("DROP INDEX ").append(indexName);
|
||||||
DB.executeUpdateEx(alter.toString(), trxName);
|
DB.executeUpdateEx(alter.toString(), trxName);
|
||||||
alter = new StringBuilder("CREATE INDEX ")
|
if (pi != null)
|
||||||
.append(indexName)
|
pi.addLog(0, null, null, alter.toString());
|
||||||
.append(" ")
|
indexdef = indexdef.replace(" ON adempiere."+getDefaultPartitionName(table).toLowerCase()+" ", " ON adempiere."+table.getTableName().toLowerCase()+" ");
|
||||||
.append("ON ")
|
DB.executeUpdateEx(indexdef, trxName);
|
||||||
.append(table.getTableName())
|
if (pi != null)
|
||||||
.append("(")
|
pi.addLog(0, null, null, indexdef);
|
||||||
.append(String.join(",", columns))
|
|
||||||
.append(")");
|
|
||||||
DB.executeUpdateEx(alter.toString(), trxName);
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -317,9 +291,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
StringBuilder alterStmt = new StringBuilder();
|
StringBuilder alterStmt = new StringBuilder();
|
||||||
alterStmt.append("ALTER TABLE ").append(table.getTableName()).append(" ");
|
alterStmt.append("ALTER TABLE ").append(table.getTableName()).append(" ");
|
||||||
alterStmt.append("ATTACH PARTITION ").append(getDefaultPartitionName(table)).append(" DEFAULT");
|
alterStmt.append("ATTACH PARTITION ").append(getDefaultPartitionName(table)).append(" DEFAULT");
|
||||||
int no = DB.executeUpdateEx(alterStmt.toString(), trxName);
|
DB.executeUpdateEx(alterStmt.toString(), trxName);
|
||||||
if (pi != null)
|
if (pi != null)
|
||||||
pi.addLog(0, null, null, no + " " + alterStmt.toString());
|
pi.addLog(0, null, null, alterStmt.toString());
|
||||||
|
|
||||||
table.createTablePartition(getDefaultPartitionName(table), "DEFAULT", trxName, table.getPartitionKeyColumns(false).get(0));
|
table.createTablePartition(getDefaultPartitionName(table), "DEFAULT", trxName, table.getPartitionKeyColumns(false).get(0));
|
||||||
|
|
||||||
|
@ -394,9 +368,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
|
|
||||||
createStmt.append(" (").append(partitionKeyColumn.getColumnName()).append(")");
|
createStmt.append(" (").append(partitionKeyColumn.getColumnName()).append(")");
|
||||||
|
|
||||||
int no = DB.executeUpdateEx(createStmt.toString(), trxName);
|
DB.executeUpdateEx(createStmt.toString(), trxName);
|
||||||
if (processInfo != null)
|
if (processInfo != null)
|
||||||
processInfo.addLog(0, null, null, no + " " + createStmt.toString());
|
processInfo.addLog(0, null, null, createStmt.toString());
|
||||||
|
|
||||||
if (!migrateDBContrainsts(table, trxName, processInfo))
|
if (!migrateDBContrainsts(table, trxName, processInfo))
|
||||||
throw new AdempiereException(Msg.getMsg(Env.getCtx(), "FailedMigrateDatabaseConstraints"));
|
throw new AdempiereException(Msg.getMsg(Env.getCtx(), "FailedMigrateDatabaseConstraints"));
|
||||||
|
@ -407,6 +381,8 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
if (!attachDefaultPartition(table, trxName, processInfo))
|
if (!attachDefaultPartition(table, trxName, processInfo))
|
||||||
throw new AdempiereException(Msg.getMsg(Env.getCtx(), "FailedAttachDefaultPartition"));
|
throw new AdempiereException(Msg.getMsg(Env.getCtx(), "FailedAttachDefaultPartition"));
|
||||||
|
|
||||||
|
fixView(table, trxName, processInfo);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -418,6 +394,120 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Re-create view after rename table
|
||||||
|
* @param table
|
||||||
|
* @param trxName
|
||||||
|
* @param pi
|
||||||
|
*/
|
||||||
|
private void fixView(MTable table, String trxName, ProcessInfo pi) {
|
||||||
|
String views =
|
||||||
|
"""
|
||||||
|
with recursive depv(relname, viewoid, depth) as (
|
||||||
|
select distinct a.relname, a.oid, 1
|
||||||
|
from pg_class a, pg_depend b, pg_depend c, pg_class d, pg_namespace
|
||||||
|
where a.oid = b.refobjid
|
||||||
|
and b.objid = c.objid
|
||||||
|
and b.refobjid <> c.refobjid
|
||||||
|
and c.refobjid = d.oid
|
||||||
|
and d.relname = ?
|
||||||
|
and d.relkind = 'r'
|
||||||
|
and a.relkind = 'v'
|
||||||
|
and a.relnamespace = pg_namespace.oid
|
||||||
|
and pg_namespace.nspname = lower('adempiere')
|
||||||
|
union all
|
||||||
|
select distinct dependee.relname, dependee.oid, depv.depth+1
|
||||||
|
from pg_depend
|
||||||
|
join pg_rewrite on pg_depend.objid = pg_rewrite.oid
|
||||||
|
join pg_class as dependee on pg_rewrite.ev_class = dependee.oid
|
||||||
|
join pg_class as dependent on pg_depend.refobjid = dependent.oid
|
||||||
|
join pg_attribute ON pg_depend.refobjid = pg_attribute.attrelid and pg_depend.refobjsubid = pg_attribute.attnum and pg_attribute.attnum > 0
|
||||||
|
join depv on dependent.relname = depv.relname
|
||||||
|
join pg_namespace on dependee.relnamespace = pg_namespace.oid
|
||||||
|
where pg_namespace.nspname = lower('adempiere')
|
||||||
|
)
|
||||||
|
select relname, viewoid, max(depth) from depv group by relname, viewoid order by 3 desc
|
||||||
|
""";
|
||||||
|
String defaultPartitionName = getDefaultPartitionName(table).toLowerCase();
|
||||||
|
String tableName = table.getTableName().toLowerCase();
|
||||||
|
List<String> viewTexts = new ArrayList<String>();
|
||||||
|
List<String> viewNames = new ArrayList<String>();
|
||||||
|
List<String> grants = new ArrayList<String>();
|
||||||
|
try(PreparedStatement stmt = DB.prepareStatement(views, trxName)) {
|
||||||
|
stmt.setString(1, defaultPartitionName);
|
||||||
|
ResultSet rs = stmt.executeQuery();
|
||||||
|
while(rs.next()) {
|
||||||
|
String viewName = rs.getString(1);
|
||||||
|
viewNames.add(viewName);
|
||||||
|
int oid = rs.getInt(2);
|
||||||
|
String viewText = DB.getSQLValueString(trxName, "SELECT pg_get_viewdef(?)", oid);
|
||||||
|
viewTexts.add(viewText);
|
||||||
|
}
|
||||||
|
|
||||||
|
String grantSQL =
|
||||||
|
"""
|
||||||
|
SELECT String_agg('grant ' || privilege_type || ' on ' || table_name || ' to "' || grantee || '"', '; ')
|
||||||
|
FROM information_schema.role_table_grants
|
||||||
|
WHERE table_name=? and table_schema='adempiere'
|
||||||
|
""";
|
||||||
|
for(int i = 0; i < viewNames.size(); i++) {
|
||||||
|
String viewName = viewNames.get(i);
|
||||||
|
try(PreparedStatement stmt1 = DB.prepareStatement(grantSQL, trxName)) {
|
||||||
|
stmt1.setString(1, viewName.toLowerCase());
|
||||||
|
ResultSet rs1 = stmt1.executeQuery();
|
||||||
|
while(rs1.next()) {
|
||||||
|
grants.add(rs1.getString(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
StringBuilder dropStmt = new StringBuilder("DROP VIEW ").append(viewName);
|
||||||
|
DB.executeUpdateEx(dropStmt.toString(), trxName);
|
||||||
|
if (pi != null)
|
||||||
|
pi.addLog(0, null, null, dropStmt.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = viewNames.size()-1; i >=0; i--) {
|
||||||
|
String viewName = viewNames.get(i);
|
||||||
|
String viewText = viewTexts.get(i);
|
||||||
|
String grant = grants.get(i);
|
||||||
|
StringBuilder createStmt = new StringBuilder("CREATE OR REPLACE VIEW ").append(viewName).append(" AS ");
|
||||||
|
if (viewText.contains(" "+defaultPartitionName + " ")) {
|
||||||
|
viewText = viewText.replace(" "+defaultPartitionName+" ", " "+tableName+" ");
|
||||||
|
}
|
||||||
|
if (viewText.contains(" "+defaultPartitionName + "\n")) {
|
||||||
|
viewText = viewText.replace(" "+defaultPartitionName+"\n", " "+tableName+"\n");
|
||||||
|
}
|
||||||
|
if (viewText.contains(" "+defaultPartitionName + ".")) {
|
||||||
|
viewText = viewText.replace(" "+defaultPartitionName+".", " "+tableName+".");
|
||||||
|
}
|
||||||
|
if (viewText.contains("("+defaultPartitionName + " ")) {
|
||||||
|
viewText = viewText.replace("("+defaultPartitionName+" ", "("+tableName+" ");
|
||||||
|
}
|
||||||
|
if (viewText.contains("("+defaultPartitionName + "\n")) {
|
||||||
|
viewText = viewText.replace("("+defaultPartitionName+"\n", "("+tableName+"\n");
|
||||||
|
}
|
||||||
|
if (viewText.contains("("+defaultPartitionName + ".")) {
|
||||||
|
viewText = viewText.replace("("+defaultPartitionName+".", "("+tableName+".");
|
||||||
|
}
|
||||||
|
String operators = "=><+-*/|%^&#~!";
|
||||||
|
for (int j = 0; j < operators.length(); j++) {
|
||||||
|
String find = operators.charAt(j)+defaultPartitionName + ".";
|
||||||
|
String replace = operators.charAt(j)+tableName+".";
|
||||||
|
if (viewText.contains(find)) {
|
||||||
|
viewText = viewText.replace(find, replace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
createStmt.append(viewText);
|
||||||
|
DB.executeUpdateEx(createStmt.toString(), trxName);
|
||||||
|
if (pi != null)
|
||||||
|
pi.addLog(0, null, null, "CREATE OR REPLACE VIEW "+viewName);
|
||||||
|
DB.executeUpdateEx(grant, trxName);
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new DBException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get DB partition key definition
|
* Get DB partition key definition
|
||||||
* @param table
|
* @param table
|
||||||
|
@ -610,9 +700,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
StringBuilder alterStmt = new StringBuilder();
|
StringBuilder alterStmt = new StringBuilder();
|
||||||
alterStmt.append("ALTER TABLE ").append(tableName).append(" ");
|
alterStmt.append("ALTER TABLE ").append(tableName).append(" ");
|
||||||
alterStmt.append("ATTACH PARTITION ").append(partition.getName()).append(" ").append(partition.getExpressionPartition());
|
alterStmt.append("ATTACH PARTITION ").append(partition.getName()).append(" ").append(partition.getExpressionPartition());
|
||||||
no = DB.executeUpdateEx(alterStmt.toString(), trxName);
|
DB.executeUpdateEx(alterStmt.toString(), trxName);
|
||||||
if (pi != null)
|
if (pi != null)
|
||||||
pi.addLog(0, null, null, no + " " + alterStmt.toString());
|
pi.addLog(0, null, null, alterStmt.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -653,9 +743,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
createStmt.append(subPartitionColumn.getColumnName());
|
createStmt.append(subPartitionColumn.getColumnName());
|
||||||
createStmt.append(")");
|
createStmt.append(")");
|
||||||
}
|
}
|
||||||
int no = DB.executeUpdateEx(createStmt.toString(), trxName);
|
DB.executeUpdateEx(createStmt.toString(), trxName);
|
||||||
if (pi != null)
|
if (pi != null)
|
||||||
pi.addLog(0, null, null, no + " " + createStmt.toString().replace(DB_PostgreSQL.NATIVE_MARKER, ""));
|
pi.addLog(0, null, null, createStmt.toString().replace(DB_PostgreSQL.NATIVE_MARKER, ""));
|
||||||
if (subPartitionColumn != null) {
|
if (subPartitionColumn != null) {
|
||||||
createSubDefaultPartition(table, subPartitionColumn, partition, pi, trxName);
|
createSubDefaultPartition(table, subPartitionColumn, partition, pi, trxName);
|
||||||
}
|
}
|
||||||
|
@ -700,9 +790,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
StringBuilder createStmt = new StringBuilder();
|
StringBuilder createStmt = new StringBuilder();
|
||||||
createStmt.append("CREATE TABLE ").append(subPartition.getName()).append(" (").append(DB_PostgreSQL.NATIVE_MARKER).append("LIKE ");
|
createStmt.append("CREATE TABLE ").append(subPartition.getName()).append(" (").append(DB_PostgreSQL.NATIVE_MARKER).append("LIKE ");
|
||||||
createStmt.append(subDefaultPartition).append(" INCLUDING ALL)");
|
createStmt.append(subDefaultPartition).append(" INCLUDING ALL)");
|
||||||
int no = DB.executeUpdateEx(createStmt.toString(), trxName);
|
DB.executeUpdateEx(createStmt.toString(), trxName);
|
||||||
if (pi != null)
|
if (pi != null)
|
||||||
pi.addLog(0, null, null, no + " " + createStmt.toString().replace(DB_PostgreSQL.NATIVE_MARKER, ""));
|
pi.addLog(0, null, null, createStmt.toString().replace(DB_PostgreSQL.NATIVE_MARKER, ""));
|
||||||
Object subValue = subValues.get(subPartition.getName());
|
Object subValue = subValues.get(subPartition.getName());
|
||||||
moveDefaultPartitionDataForList(subPartition, subPartitionColumn, partition.getName(), subDefaultPartition, subValue, pi, trxName);
|
moveDefaultPartitionDataForList(subPartition, subPartitionColumn, partition.getName(), subDefaultPartition, subValue, pi, trxName);
|
||||||
}
|
}
|
||||||
|
@ -720,9 +810,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
StringBuilder createStmt = new StringBuilder();
|
StringBuilder createStmt = new StringBuilder();
|
||||||
createStmt.append("CREATE TABLE ").append(subPartition.getName()).append(" (").append(DB_PostgreSQL.NATIVE_MARKER).append("LIKE ");
|
createStmt.append("CREATE TABLE ").append(subPartition.getName()).append(" (").append(DB_PostgreSQL.NATIVE_MARKER).append("LIKE ");
|
||||||
createStmt.append(subDefaultPartition).append(" INCLUDING ALL)");
|
createStmt.append(subDefaultPartition).append(" INCLUDING ALL)");
|
||||||
int no = DB.executeUpdateEx(createStmt.toString(), trxName);
|
DB.executeUpdateEx(createStmt.toString(), trxName);
|
||||||
if (pi != null)
|
if (pi != null)
|
||||||
pi.addLog(0, null, null, no + " " + createStmt.toString().replace(DB_PostgreSQL.NATIVE_MARKER, ""));
|
pi.addLog(0, null, null, createStmt.toString().replace(DB_PostgreSQL.NATIVE_MARKER, ""));
|
||||||
moveDefaultPartitionDataForRange(subPartition, subPartitionColumn, partition.getName(), subDefaultPartition, rangePartitionInterval, pi, trxName);
|
moveDefaultPartitionDataForRange(subPartition, subPartitionColumn, partition.getName(), subDefaultPartition, rangePartitionInterval, pi, trxName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -814,9 +904,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
StringBuilder alterStmt = new StringBuilder();
|
StringBuilder alterStmt = new StringBuilder();
|
||||||
alterStmt.append("ALTER TABLE ").append(tableName).append(" ");
|
alterStmt.append("ALTER TABLE ").append(tableName).append(" ");
|
||||||
alterStmt.append("ATTACH PARTITION ").append(partition.getName()).append(" ").append(partition.getExpressionPartition());
|
alterStmt.append("ATTACH PARTITION ").append(partition.getName()).append(" ").append(partition.getExpressionPartition());
|
||||||
no = DB.executeUpdateEx(alterStmt.toString(), trxName);
|
DB.executeUpdateEx(alterStmt.toString(), trxName);
|
||||||
if (pi != null)
|
if (pi != null)
|
||||||
pi.addLog(0, null, null, no + " " + alterStmt.toString());
|
pi.addLog(0, null, null, alterStmt.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -850,9 +940,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
createStmt.append(subPartitionColumn.getColumnName());
|
createStmt.append(subPartitionColumn.getColumnName());
|
||||||
createStmt.append(")");
|
createStmt.append(")");
|
||||||
}
|
}
|
||||||
int no = DB.executeUpdateEx(createStmt.toString(), trxName);
|
DB.executeUpdateEx(createStmt.toString(), trxName);
|
||||||
if (pi != null)
|
if (pi != null)
|
||||||
pi.addLog(0, null, null, no + " " + createStmt.toString().replace(DB_PostgreSQL.NATIVE_MARKER, ""));
|
pi.addLog(0, null, null, createStmt.toString().replace(DB_PostgreSQL.NATIVE_MARKER, ""));
|
||||||
|
|
||||||
if (subPartitionColumn != null) {
|
if (subPartitionColumn != null) {
|
||||||
createSubDefaultPartition(table, subPartitionColumn, partition, pi, trxName);
|
createSubDefaultPartition(table, subPartitionColumn, partition, pi, trxName);
|
||||||
|
@ -898,9 +988,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
StringBuilder createStmt = new StringBuilder();
|
StringBuilder createStmt = new StringBuilder();
|
||||||
createStmt.append("CREATE TABLE ").append(subPartition.getName()).append(" (").append(DB_PostgreSQL.NATIVE_MARKER).append("LIKE ");
|
createStmt.append("CREATE TABLE ").append(subPartition.getName()).append(" (").append(DB_PostgreSQL.NATIVE_MARKER).append("LIKE ");
|
||||||
createStmt.append(subDefaultPartition).append(" INCLUDING ALL)");
|
createStmt.append(subDefaultPartition).append(" INCLUDING ALL)");
|
||||||
int no = DB.executeUpdateEx(createStmt.toString(), trxName);
|
DB.executeUpdateEx(createStmt.toString(), trxName);
|
||||||
if (pi != null)
|
if (pi != null)
|
||||||
pi.addLog(0, null, null, no + " " + createStmt.toString().replace(DB_PostgreSQL.NATIVE_MARKER, ""));
|
pi.addLog(0, null, null, createStmt.toString().replace(DB_PostgreSQL.NATIVE_MARKER, ""));
|
||||||
Object subValue = subValues.get(subPartition.getName());
|
Object subValue = subValues.get(subPartition.getName());
|
||||||
moveDefaultPartitionDataForList(subPartition, subPartitionColumn, partition.getName(), subDefaultPartition, subValue, pi, trxName);
|
moveDefaultPartitionDataForList(subPartition, subPartitionColumn, partition.getName(), subDefaultPartition, subValue, pi, trxName);
|
||||||
}
|
}
|
||||||
|
@ -918,9 +1008,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
StringBuilder createStmt = new StringBuilder();
|
StringBuilder createStmt = new StringBuilder();
|
||||||
createStmt.append("CREATE TABLE ").append(subPartition.getName()).append(" (").append(DB_PostgreSQL.NATIVE_MARKER).append("LIKE ");
|
createStmt.append("CREATE TABLE ").append(subPartition.getName()).append(" (").append(DB_PostgreSQL.NATIVE_MARKER).append("LIKE ");
|
||||||
createStmt.append(subDefaultPartition).append(" INCLUDING ALL)");
|
createStmt.append(subDefaultPartition).append(" INCLUDING ALL)");
|
||||||
int no = DB.executeUpdateEx(createStmt.toString(), trxName);
|
DB.executeUpdateEx(createStmt.toString(), trxName);
|
||||||
if (pi != null)
|
if (pi != null)
|
||||||
pi.addLog(0, null, null, no + " " + createStmt.toString().replace(DB_PostgreSQL.NATIVE_MARKER, ""));
|
pi.addLog(0, null, null, createStmt.toString().replace(DB_PostgreSQL.NATIVE_MARKER, ""));
|
||||||
moveDefaultPartitionDataForRange(subPartition, subPartitionColumn, partition.getName(), subDefaultPartition, rangePartitionInterval, pi, trxName);
|
moveDefaultPartitionDataForRange(subPartition, subPartitionColumn, partition.getName(), subDefaultPartition, rangePartitionInterval, pi, trxName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -944,16 +1034,16 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
.append(partition.getName()).append("_default_partition (").append(DB_PostgreSQL.NATIVE_MARKER).append("LIKE ")
|
.append(partition.getName()).append("_default_partition (").append(DB_PostgreSQL.NATIVE_MARKER).append("LIKE ")
|
||||||
.append(partition.getName())
|
.append(partition.getName())
|
||||||
.append(" INCLUDING ALL)");
|
.append(" INCLUDING ALL)");
|
||||||
int no = DB.executeUpdateEx(subStmt.toString(), trxName);
|
DB.executeUpdateEx(subStmt.toString(), trxName);
|
||||||
if (pi != null)
|
if (pi != null)
|
||||||
pi.addLog(0, null, null, no + " " + subStmt.toString());
|
pi.addLog(0, null, null, subStmt.toString());
|
||||||
subStmt = new StringBuilder("ALTER TABLE ")
|
subStmt = new StringBuilder("ALTER TABLE ")
|
||||||
.append(partition.getName())
|
.append(partition.getName())
|
||||||
.append(" ATTACH PARTITION ")
|
.append(" ATTACH PARTITION ")
|
||||||
.append(partition.getName()).append("_default_partition DEFAULT ");
|
.append(partition.getName()).append("_default_partition DEFAULT ");
|
||||||
no = DB.executeUpdateEx(subStmt.toString(), trxName);
|
DB.executeUpdateEx(subStmt.toString(), trxName);
|
||||||
if (pi != null)
|
if (pi != null)
|
||||||
pi.addLog(0, null, null, no + " " + subStmt.toString().replace(DB_PostgreSQL.NATIVE_MARKER, ""));
|
pi.addLog(0, null, null, subStmt.toString().replace(DB_PostgreSQL.NATIVE_MARKER, ""));
|
||||||
table.createTablePartition(partition.getName()+"_default_partition", "DEFAULT", trxName, subPartitionColumn, partition);
|
table.createTablePartition(partition.getName()+"_default_partition", "DEFAULT", trxName, subPartitionColumn, partition);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -961,9 +1051,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
public boolean runPostPartitionProcess(MTable table, String trxName, ProcessInfo processInfo) {
|
public boolean runPostPartitionProcess(MTable table, String trxName, ProcessInfo processInfo) {
|
||||||
StringBuilder stmt = new StringBuilder();
|
StringBuilder stmt = new StringBuilder();
|
||||||
stmt.append("VACUUM ANALYZE ").append(table.getTableName());
|
stmt.append("VACUUM ANALYZE ").append(table.getTableName());
|
||||||
int no = DB.executeUpdateEx(stmt.toString(), trxName);
|
DB.executeUpdateEx(stmt.toString(), trxName);
|
||||||
if (processInfo != null)
|
if (processInfo != null)
|
||||||
processInfo.addLog(0, null, null, no + " " + stmt.toString());
|
processInfo.addLog(0, null, null, stmt.toString());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1050,9 +1140,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
alter.append(table.getTableName()).append(" ");
|
alter.append(table.getTableName()).append(" ");
|
||||||
}
|
}
|
||||||
alter.append("DETACH PARTITION ").append(partition.getName());
|
alter.append("DETACH PARTITION ").append(partition.getName());
|
||||||
int no = DB.executeUpdateEx(alter.toString(), trxName);
|
DB.executeUpdateEx(alter.toString(), trxName);
|
||||||
if (processInfo != null)
|
if (processInfo != null)
|
||||||
processInfo.addLog(0, null, null, no + " " + alter.toString());
|
processInfo.addLog(0, null, null, alter.toString());
|
||||||
partition.setIsPartitionAttached(false);
|
partition.setIsPartitionAttached(false);
|
||||||
partition.saveEx();
|
partition.saveEx();
|
||||||
} else {
|
} else {
|
||||||
|
@ -1079,9 +1169,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
.append(partition.getExpressionPartition());
|
.append(partition.getExpressionPartition());
|
||||||
boolean success = true;
|
boolean success = true;
|
||||||
try {
|
try {
|
||||||
int no = DB.executeUpdateEx(alter.toString(), trxName);
|
DB.executeUpdateEx(alter.toString(), trxName);
|
||||||
if (processInfo != null)
|
if (processInfo != null)
|
||||||
processInfo.addLog(0, null, null, no + " " + alter.toString());
|
processInfo.addLog(0, null, null, alter.toString());
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
success = false;
|
success = false;
|
||||||
Trx.get(trxName, false).rollback();
|
Trx.get(trxName, false).rollback();
|
||||||
|
@ -1102,9 +1192,9 @@ public class TablePartitionService implements ITablePartitionService {
|
||||||
if (processInfo != null)
|
if (processInfo != null)
|
||||||
processInfo.addLog(0, null, null, no + " " + updateStmt.toString());
|
processInfo.addLog(0, null, null, no + " " + updateStmt.toString());
|
||||||
alter = new StringBuilder("DROP TABLE ").append(partition.getName());
|
alter = new StringBuilder("DROP TABLE ").append(partition.getName());
|
||||||
no = DB.executeUpdateEx(alter.toString(), trxName);
|
DB.executeUpdateEx(alter.toString(), trxName);
|
||||||
if (processInfo != null)
|
if (processInfo != null)
|
||||||
processInfo.addLog(0, null, null, no + " " + alter.toString());
|
processInfo.addLog(0, null, null, alter.toString());
|
||||||
try {
|
try {
|
||||||
Trx.get(trxName, false).commit(true);
|
Trx.get(trxName, false).commit(true);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
|
Loading…
Reference in New Issue