diff --git a/config/alfresco/bootstrap-context.xml b/config/alfresco/bootstrap-context.xml
index 4b3adcd99b..54f1bfa245 100644
--- a/config/alfresco/bootstrap-context.xml
+++ b/config/alfresco/bootstrap-context.xml
@@ -94,6 +94,7 @@
+
diff --git a/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.Dialect/AlfrescoSchemaUpdate-2.2-CleanNodeStatuses.sql b/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.Dialect/AlfrescoSchemaUpdate-2.2-CleanNodeStatuses.sql
new file mode 100644
index 0000000000..d4889a4a6d
--- /dev/null
+++ b/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.Dialect/AlfrescoSchemaUpdate-2.2-CleanNodeStatuses.sql
@@ -0,0 +1,22 @@
+--
+-- Title: Clean duplicate alf_node_status entries
+-- Database: Generic
+-- Since: V3.1 schema 1011
+-- Author: Derek Hulley
+--
+-- Please contact support@alfresco.com if you need assistance with the upgrade.
+--
+-- Does nothing. The script is only meaningful for DBs supported by Alfresco on V2.1
+-- This script does not need to run if the server has already been upgraded to schema 90 or later
+
+--
+-- Record script finish
+--
+DELETE FROM alf_applied_patch WHERE id = 'patch.db-V2.2-CleanNodeStatuses';
+INSERT INTO alf_applied_patch
+ (id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
+ VALUES
+ (
+ 'patch.db-V2.2-CleanNodeStatuses', 'Manually executed script upgrade V2.2: Clean alf_node_status table',
+ 0, 89, -1, 90, null, 'UNKOWN', ${true}, ${true}, 'Script completed'
+ );
diff --git a/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoSchemaUpdate-2.2-CleanNodeStatuses.sql b/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoSchemaUpdate-2.2-CleanNodeStatuses.sql
new file mode 100644
index 0000000000..3fca009a94
--- /dev/null
+++ b/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoSchemaUpdate-2.2-CleanNodeStatuses.sql
@@ -0,0 +1,58 @@
+--
+-- Title: Clean duplicate alf_node_status entries
+-- Database: MySQL
+-- Since: V3.1 schema 1011
+-- Author: Derek Hulley
+--
+-- Please contact support@alfresco.com if you need assistance with the upgrade.
+--
+-- Cleans out duplicate alf_node_status entries for V2.1 installations.
+-- This script does not need to run if the server has already been upgraded to schema 90 or later
+
+CREATE TABLE t_node_status
+(
+ node_id INTEGER NOT NULL,
+ transaction_id BIGINT(20) NOT NULL,
+ PRIMARY KEY (node_id)
+);
+INSERT INTO t_node_status
+(
+ SELECT c.node_id, c.transaction_id FROM
+ (
+ SELECT COUNT(node_id) x, ns.node_id, ns.transaction_id FROM alf_node_status ns GROUP BY node_id
+ ) c
+ WHERE c.x > 1
+);
+DELETE FROM alf_node_status WHERE node_id IN (SELECT node_id FROM t_node_status);
+INSERT INTO alf_node_status (protocol, identifier, guid, node_id, transaction_id, version)
+(
+ SELECT n.protocol, n.identifier, n.uuid, n.id, tns.transaction_id, 0 FROM t_node_status tns JOIN alf_node n ON (n.id = tns.node_id)
+);
+DROP TABLE t_node_status;
+
+DELETE FROM alf_node_status WHERE node_id IS NULL;
+
+UPDATE alf_node_status ns SET ns.protocol =
+ (
+ SELECT n.protocol FROM alf_node n WHERE n.id = ns.node_id
+ );
+
+DELETE
+ alf_transaction
+ FROM
+ alf_transaction
+ LEFT JOIN alf_node_status ON (alf_node_status.transaction_id = alf_transaction.id)
+ WHERE
+ alf_node_status.node_id is null;
+
+--
+-- Record script finish
+--
+DELETE FROM alf_applied_patch WHERE id = 'patch.db-V2.2-CleanNodeStatuses';
+INSERT INTO alf_applied_patch
+ (id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
+ VALUES
+ (
+ 'patch.db-V2.2-CleanNodeStatuses', 'Manually executed script upgrade V2.2: Clean alf_node_status table',
+ 0, 89, -1, 90, null, 'UNKOWN', ${true}, ${true}, 'Script completed'
+ );
diff --git a/config/alfresco/patch/patch-services-context.xml b/config/alfresco/patch/patch-services-context.xml
index f8b3ed1a7d..4a552f085e 100644
--- a/config/alfresco/patch/patch-services-context.xml
+++ b/config/alfresco/patch/patch-services-context.xml
@@ -1148,6 +1148,21 @@
+
+ patch.db-V2.2-CleanNodeStatuses
+ patch.schemaUpgradeScript.description
+ 0
+ 89
+ 90
+
+ classpath:alfresco/dbscripts/upgrade/2.2/${db.script.dialect}/AlfrescoSchemaUpdate-2.2-CleanNodeStatuses.sql
+
+
+
+
+
+
+
patch.db-V2.2-0-CreateMissingTables
patch.schemaUpgradeScript.description
@@ -1159,6 +1174,7 @@
+
@@ -1181,6 +1197,7 @@
+
diff --git a/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java b/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java
index bd46a9f6ec..8584ac2572 100644
--- a/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java
+++ b/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java
@@ -889,6 +889,8 @@ public class SchemaBootstrap extends AbstractLifecycleBean
File scriptFile,
String scriptUrl) throws Exception
{
+ final Dialect dialect = Dialect.getDialect(cfg.getProperties());
+
StringBuilder executedStatements = executedStatementsThreadLocal.get();
if (executedStatements == null)
{
@@ -917,6 +919,24 @@ public class SchemaBootstrap extends AbstractLifecycleBean
String fetchVarName = null;
String fetchColumnName = null;
Map varAssignments = new HashMap(13);
+ // Special variable assignments:
+ if (dialect instanceof PostgreSQLDialect)
+ {
+ // Needs 1/0 for true/false
+ varAssignments.put("true", "true");
+ varAssignments.put("false", "false");
+ varAssignments.put("TRUE", "TRUE");
+ varAssignments.put("FALSE", "FALSE");
+ }
+ else
+ {
+ // Needs true/false as strings
+ varAssignments.put("true", "1");
+ varAssignments.put("false", "0");
+ varAssignments.put("TRUE", "1");
+ varAssignments.put("FALSE", "0");
+ }
+
while(true)
{
String sqlOriginal = reader.readLine();