Author: astaric Date: Tue Jul 23 14:37:58 2013 New Revision: 1506070 URL: http://svn.apache.org/r1506070 Log: Do not add product column when translating INSERT statements, if one already exists.
Refs: #601 Modified: bloodhound/trunk/bloodhound_multiproduct/multiproduct/dbcursor.py bloodhound/trunk/bloodhound_multiproduct/tests/db/cursor.py Modified: bloodhound/trunk/bloodhound_multiproduct/multiproduct/dbcursor.py URL: http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_multiproduct/multiproduct/dbcursor.py?rev=1506070&r1=1506069&r2=1506070&view=diff ============================================================================== --- bloodhound/trunk/bloodhound_multiproduct/multiproduct/dbcursor.py (original) +++ bloodhound/trunk/bloodhound_multiproduct/multiproduct/dbcursor.py Tue Jul 23 14:37:58 2013 @@ -533,6 +533,11 @@ class BloodhoundProductSQLTranslate(obje ptoken = self._token_next(columns_token, ptoken) last_token = ptoken while ptoken: + if isinstance(ptoken, Types.IdentifierList): + if any(i.get_name() == 'product' + for i in ptoken.get_identifiers() + if isinstance(i, Types.Identifier)): + return True last_token = ptoken ptoken = self._token_next(columns_token, ptoken) if not last_token or \ @@ -540,7 +545,7 @@ class BloodhoundProductSQLTranslate(obje raise Exception("Invalid INSERT statement, unable to find column parenthesis end") for keyword in [',', ' ', self._product_column]: self._token_insert_before(columns_token, last_token, Types.Token(Tokens.Keyword, keyword)) - return + return False def insert_extra_column_value(tablename, ptoken, before_token): if tablename in self._translate_tables: for keyword in [',', "'", self._product_prefix, "'"]: @@ -548,6 +553,7 @@ class BloodhoundProductSQLTranslate(obje return tablename = None table_name_token = self._token_next(parent, token) + has_product_column = False if isinstance(table_name_token, Types.Function): token = self._token_first(table_name_token) if isinstance(token, Types.Identifier): @@ -556,7 +562,7 @@ class BloodhoundProductSQLTranslate(obje if columns_token.match(Tokens.Keyword, 'VALUES'): token = columns_token else: - insert_extra_column(tablename, columns_token) + has_product_column = insert_extra_column(tablename, columns_token) token = self._token_next(parent, table_name_token) else: tablename = table_name_token.value @@ -564,9 +570,11 @@ class BloodhoundProductSQLTranslate(obje if columns_token.match(Tokens.Keyword, 'VALUES'): token = columns_token else: - insert_extra_column(tablename, columns_token) + has_product_column = insert_extra_column(tablename, columns_token) token = self._token_next(parent, columns_token) - if token.match(Tokens.Keyword, 'VALUES'): + if has_product_column: + pass # INSERT already has product, no translation needed + elif token.match(Tokens.Keyword, 'VALUES'): separators = [',', '(', ')'] token = self._token_next(parent, token) while 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=1506070&r1=1506069&r2=1506070&view=diff ============================================================================== --- bloodhound/trunk/bloodhound_multiproduct/tests/db/cursor.py (original) +++ bloodhound/trunk/bloodhound_multiproduct/tests/db/cursor.py Tue Jul 23 14:37:58 2013 @@ -987,7 +987,14 @@ data = { """create temporary table table_old as select * from table""", """create temporary table "PRODUCT_table_old" as select * from (SELECT * FROM "PRODUCT_table") AS table""", ) - ] + ], + # insert with specified product (#601) + 'insert_with_product': [ + ( +"""INSERT INTO ticket (summary, product) VALUES ('S', 'swlcu')""", +"""INSERT INTO ticket (summary, product) VALUES ('S', 'swlcu')""" + ), + ], } @@ -1045,6 +1052,9 @@ class DbCursorTestCase(unittest.TestCase def test_lowercase_tokens(self): self._run_test('lowercase_tokens') + def test_insert_with_product(self): + self._run_test('insert_with_product') + if __name__ == '__main__': unittest.main()