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