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()