Author: astaric Date: Wed May 8 11:14:34 2013 New Revision: 1480224 URL: http://svn.apache.org/r1480224 Log: Translate SELECT part of CREATE TABLE ... AS SELECT ... queries.
Fixes an issue where some product plugin tables were prepopulated with rows from global product. Modified: bloodhound/trunk/bloodhound_multiproduct/multiproduct/dbcursor.py bloodhound/trunk/bloodhound_multiproduct/tests/db/cursor.py bloodhound/trunk/bloodhound_multiproduct/tests/upgrade.py Modified: bloodhound/trunk/bloodhound_multiproduct/multiproduct/dbcursor.py URL: http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_multiproduct/multiproduct/dbcursor.py?rev=1480224&r1=1480223&r2=1480224&view=diff ============================================================================== --- bloodhound/trunk/bloodhound_multiproduct/multiproduct/dbcursor.py (original) +++ bloodhound/trunk/bloodhound_multiproduct/multiproduct/dbcursor.py Wed May 8 11:14:34 2013 @@ -700,7 +700,16 @@ class BloodhoundProductSQLTranslate(obje table_name = self._get_entity_name_from_token(parent, token) if not table_name: raise Exception("Invalid CREATE TABLE statement, expected table name") + + as_token = self._token_next_match(parent, token, + Tokens.Keyword, 'AS') self._replace_table_entity_name(parent, token, table_name) + + if as_token: + select_token = self._token_next_match(parent, as_token, + Tokens.DML, 'SELECT') + if select_token: + return self._select(parent, select_token) elif token.match(Tokens.Keyword, ['UNIQUE', 'INDEX']): if token.match(Tokens.Keyword, 'UNIQUE'): token = self._token_next(parent, token) Modified: bloodhound/trunk/bloodhound_multiproduct/tests/db/cursor.py URL: http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_multiproduct/tests/db/cursor.py?rev=1480224&r1=1480223&r2=1480224&view=diff ============================================================================== --- bloodhound/trunk/bloodhound_multiproduct/tests/db/cursor.py (original) +++ bloodhound/trunk/bloodhound_multiproduct/tests/db/cursor.py Wed May 8 11:14:34 2013 @@ -955,8 +955,13 @@ data = { " PRIMARY KEY(bklg_id, tkt_id))""", """CREATE TEMPORARY TABLE "PRODUCT_backlog_ticket" (bklg_id INTEGER NOT NULL," " tkt_id INTEGER NOT NULL," - " tkt_order REAL," - " PRIMARY KEY(bklg_id, tkt_id))""" + " tkt_order REAL," + " PRIMARY KEY(bklg_id, tkt_id))""" + ), + ( +"""CREATE TEMPORARY TABLE table_old AS SELECT * FROM table""", +"""CREATE TEMPORARY TABLE "PRODUCT_table_old" AS SELECT * FROM""" +""" (SELECT * FROM "PRODUCT_table") AS table""", ), ], Modified: bloodhound/trunk/bloodhound_multiproduct/tests/upgrade.py URL: http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_multiproduct/tests/upgrade.py?rev=1480224&r1=1480223&r2=1480224&view=diff ============================================================================== --- bloodhound/trunk/bloodhound_multiproduct/tests/upgrade.py (original) +++ bloodhound/trunk/bloodhound_multiproduct/tests/upgrade.py Wed May 8 11:14:34 2013 @@ -312,6 +312,7 @@ class EnvironmentUpgradeTestCase(unittes db("""SELECT * FROM "@_dummy_table" """) def test_upgrading_existing_plugin_leaves_data_in_global_env(self): + DummyPlugin.version = 2 self._enable_component(DummyPlugin) self.env.upgrade() with self.env.db_direct_transaction as db: @@ -427,27 +428,45 @@ class DummyPlugin(Component): def upgrade_environment(self, db): old_version = current_version = self.get_version(db) + db_connector, dummy = DatabaseManager(self.env)._get_connector() - if current_version < 1 <= self.version: - db_connector, dummy = DatabaseManager(self.env)._get_connector() - for statement in db_connector.to_sql(DUMMY_TABLE): - db(statement) - current_version = 1 while current_version < self.version: + if current_version > 0: + db("CREATE TEMPORARY TABLE dummy_table_old AS " + "SELECT * FROM dummy_table") + db("DROP TABLE dummy_table") + + table = self.construct_dummy_table(current_version+1) + for statement in db_connector.to_sql(table): + db(statement) + + if current_version > 0: + cols = ['id'] + ['v%i' % (i+1) + for i in range(current_version+1)] + db("""INSERT INTO dummy_table (%s) + SELECT %s, '' FROM dummy_table_old + """ % (', '.join(cols), ', '.join(cols[:-1]))) + db("DROP TABLE dummy_table_old") + current_version += 1 - db("ALTER TABLE dummy_table " - "ADD COLUMN v%d text" % current_version) + if current_version != old_version: self.update_version(db, current_version) + def construct_dummy_table(self, n_custom_fields=1): + fields = [Column('id')] + [ + Column('v%d' % (i+1)) for i in range(n_custom_fields) + ] + return Table('dummy_table')[fields] + def get_version(self, db): rows = db("SELECT value FROM system WHERE name = %s", (self.__class__.__name__,)) - return int(rows[0][0]) if rows else -1 + return int(rows[0][0]) if rows else 0 def update_version(self, db, version): old_version = self.get_version(db) - if old_version != -1: + if old_version: db("UPDATE system SET value=%s WHERE name=%s", (version, self.__class__.__name__,)) else: @@ -455,11 +474,6 @@ class DummyPlugin(Component): % (self.__class__.__name__, version)) return version -DUMMY_TABLE = Table('dummy_table')[( - Column('id'), - Column('v1'), -)] - def test_suite(): suite = unittest.TestSuite()