Merge lp:~nahiljain/to-drizzle/parser-insert into lp:to-drizzle

Proposed by neh
Status: Merged
Merged at revision: 9
Proposed branch: lp:~nahiljain/to-drizzle/parser-insert
Merge into: lp:to-drizzle
Diff against target: 578 lines (+393/-54)
4 files modified
movetodrizzle/helpers/lexer.py (+30/-18)
movetodrizzle/helpers/parser.py (+119/-8)
movetodrizzle/helpers/statement_nodes.py (+54/-28)
tests/parser_insert_test.py (+190/-0)
To merge this branch: bzr merge lp:~nahiljain/to-drizzle/parser-insert
Reviewer Review Type Date Requested Status
Jay Pipes Approve
Review via email: mp+30958@code.launchpad.net

Description of the change

It has minor change in regular expression for strings in lexer.py.. Please check it..
It has code to parse insert table and test cases for it.

To post a comment you must log in.
Revision history for this message
Jay Pipes (jaypipes) wrote :

Very nice work, Nahil! :)

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'movetodrizzle/helpers/lexer.py'
--- movetodrizzle/helpers/lexer.py 2010-07-23 00:09:44 +0000
+++ movetodrizzle/helpers/lexer.py 2010-07-26 17:08:46 +0000
@@ -70,7 +70,16 @@
70 'no' : 'NO',70 'no' : 'NO',
71 'action' : 'ACTION',71 'action' : 'ACTION',
72 'delete' : 'DELETE',72 'delete' : 'DELETE',
73 'comment' : 'COMMENT'73 'comment' : 'COMMENT',
74 'insert' : 'INSERT',
75 'duplicate' : 'DUPLICATE',
76 'values' : 'VALUES',
77 'value' : 'VALUE',
78 'low_priority' : 'LOW_PRIORITY',
79 'delayed' : 'DELAYED',
80 'high_priority' : 'HIGH_PRIORITY',
81 'ignore' : 'IGNORE',
82 'into' : 'INTO'
7483
7584
76}85}
@@ -124,38 +133,41 @@
124133
125134
126def t_STRING(t):135def t_STRING(t):
127 r"(\'(.*)\')|(\"(.*)\")|(\`(.*)\`)"136 #r"(\'(.*)\')|(\"(.*)\")|(\`(.*)\`)"
137 r"(\'(.*?)\')|(\"(.*?)\")|(\`(.*?)\`)"
128 t.value= t.value[1:-1]138 t.value= t.value[1:-1]
129 return t139 return t
130140
141
142
131#Define a rule so that we process comments143#Define a rule so that we process comments
132def t_COMMENT_CODE(t):144def t_COMMENT_CODE(t):
133 r'\/\*.*\*\/'145 r'\/\*.*\*\/'
134 pass146 pass
135 147
136# Define a rule so we can track line numbers148# Define a rule so we can track line numbers
137def t_newline(t):149def t_newline(t):
138 r'\n+'150 r'\n+'
139 t.lexer.lineno += len(t.value)151 t.lexer.lineno += len(t.value)
140152
141# A string containing ignored characters (spaces and tabs)153# A string containing ignored characters (spaces and tabs)
142t_ignore = ' \t'154t_ignore = ' \t'
143155
144# Error handling rule156# Error handling rule
145def t_error(t):157def t_error(t):
146 print "Illegal character '%s'" % t.value[0]158 print "Illegal character '%s'" % t.value[0]
147 t.lexer.skip(1)159 t.lexer.skip(1)
148160
149# Build the lexer161# Build the lexer
150lexer = lex.lex(debug=False)162lexer = lex.lex(debug= False)
151163
152def tokenize(subject):164def tokenize(subject):
153 """Given a string subject, tokenizes the string into LexToken objects and returns them"""165 """Given a string subject, tokenizes the string into LexToken objects and returns them"""
154 lexer.input(subject)166 lexer.input(subject)
155 results= []167 results= []
156 while True:168 while True:
157 t= lex.token()169 t= lex.token()
158 if not t:170 if not t:
159 break171 break
160 results.append(t)172 results.append(t)
161 return results173 return results
162174
=== modified file 'movetodrizzle/helpers/parser.py'
--- movetodrizzle/helpers/parser.py 2010-07-23 00:09:44 +0000
+++ movetodrizzle/helpers/parser.py 2010-07-26 17:08:46 +0000
@@ -17,9 +17,10 @@
17 '''statement : statement_type SEMICOLON'''17 '''statement : statement_type SEMICOLON'''
18 p[0]= p[1]18 p[0]= p[1]
1919
20
20def p_create_table(p):21def p_create_table(p):
21 '''statement_type : create_table_simple'''22 '''statement_type : create_table_simple'''
22 p[0]=p[1]23 p[0]= p[1]
2324
24def p_create_table_simple(p):25def p_create_table_simple(p):
25 '''create_table_simple : CREATE temporary TABLE if_not_exists identifier_qualified_non_qualified_opt LPAREN col_list RPAREN table_options'''26 '''create_table_simple : CREATE temporary TABLE if_not_exists identifier_qualified_non_qualified_opt LPAREN col_list RPAREN table_options'''
@@ -142,7 +143,7 @@
142 if (len(p) == 2):143 if (len(p) == 2):
143 p[0]= p[1]144 p[0]= p[1]
144 elif (len(p) == 3):145 elif (len(p) == 3):
145 p[0]= str(p[1])+str(p[2])146 p[0]= str(p[1]) + str(p[2])
146 else:147 else:
147 p[0]= None148 p[0]= None
148149
@@ -285,21 +286,16 @@
285 p[0]= [p[2]]286 p[0]= [p[2]]
286 else:287 else:
287 p[0]= len(p) > 6;288 p[0]= len(p) > 6;
288
289
290289
291def p_unsigned_opt(p):290def p_unsigned_opt(p):
292 '''unsigned_opt : UNSIGNED291 '''unsigned_opt : UNSIGNED
293 | empty'''292 | empty'''
294 p[0]= len(p) > 1293 p[0]= len(p) > 1
295294
296
297def p_zerofill_opt(p):295def p_zerofill_opt(p):
298 '''zerofill_opt : ZEROFILL296 '''zerofill_opt : ZEROFILL
299 | empty'''297 | empty'''
300 p[0]= len(p) > 1298 p[0]= len(p) > 1
301
302
303 299
304 300
305def p_mathematical(p):301def p_mathematical(p):
@@ -365,7 +361,6 @@
365 | DEFAULT CHARACTER SET'''361 | DEFAULT CHARACTER SET'''
366 pass362 pass
367363
368
369def p_table_option_1(p):364def p_table_option_1(p):
370 """table_option : ENGINE opt_equal identifier365 """table_option : ENGINE opt_equal identifier
371 | AUTO_INCREMENT opt_equal NUMBER366 | AUTO_INCREMENT opt_equal NUMBER
@@ -400,6 +395,122 @@
400395
401396
402397
398
399
400def p_insert(p):
401 '''statement_type : insert_simple
402 | insert_set'''
403 p[0]= p[1]
404
405def p_insert_simple(p):
406 '''insert_simple : INSERT priority_opt ignore_opt into_opt identifier index_col_name_list_opt value_values LPAREN expr_default_list RPAREN on_duplicate_opt'''
407 p[0]= InsertStatement(p[2],p[3],p[5],p[6],p[9],p[11],None);
408
409def p_expr_default_list(p):
410 '''expr_default_list : expr_default COMMA expr_default_list
411 | expr_default'''
412 if(len(p) > 2):
413 p[0]= [p[1]] + p[3]
414 else:
415 p[0]= [p[1]]
416def p_expr_default(p):
417 '''expr_default : DEFAULT
418 | FLOAT
419 | STRING
420 | NUMBER'''
421 p[0]= p[1]
422
423def p_expr(p):
424 '''expr : STRING
425 | FLOAT
426 | NUMBER'''
427
428 p[0]= p[1]
429
430def p_on_duplicate_option(p):
431 '''on_duplicate_opt : ON DUPLICATE KEY UPDATE col_name_expr_list
432 | empty'''
433 if(len(p) > 5):
434 p[0]= p[5]
435 else:
436 p[0]= None
437
438
439def p_col_name_expr_list(p):
440 '''col_name_expr_list : col_name EQUAL expr COMMA col_name_expr_list
441 | col_name EQUAL expr'''
442
443 if(len(p) <= 4):
444 p[0]= [ColumnNameExprPair(p[1],p[3])];
445
446 else:
447 p[0]= [ColumnNameExprPair(p[1],p[3])] + p[5]
448
449def p_col_name(p):
450 '''col_name : identifier'''
451 p[0 = p[1]
452
453def p_value_values(p):
454 '''value_values : VALUES
455 | VALUE'''
456 p[0]= p[1]
457
458def p_priority_opt(p):
459 '''priority_opt : LOW_PRIORITY
460 | DELAYED
461 | HIGH_PRIORITY
462 | empty'''
463 if(len(p) > 1):
464 p[0]= p[1]
465 else:
466 p[0]= len(p) > 1;
467
468def p_ignore_opt(p):
469 '''ignore_opt : IGNORE
470 | empty'''
471 if(len(p) > 1):
472 p[0]= p[1];
473 else:
474 p[0]= len(p) > 1;
475
476def p_into_opt(p):
477 '''into_opt : INTO
478 | empty'''
479 if(len(p) > 1):
480 p[0]= p[1];
481 else:
482 p[0]= len(p) > 1;
483
484
485
486
487def p_index_col_name_list_opt(p):
488 '''index_col_name_list_opt : LPAREN index_col_name_list RPAREN
489 | empty '''
490 if(len(p) == 4):
491 p[0]= p[2]
492 else:
493 p[0]= None
494
495def p_insert_set(p):
496 '''insert_set : INSERT priority_opt ignore_opt into_opt identifier SET col_name_expr_default_list on_duplicate_opt'''
497 p[0]= InsertStatement(p[2],p[3],p[5],None,None,p[8],p[7]);
498 '''insert_simple : INSERT priority_opt ignore_opt into_opt identifier index_col_name_list_opt value_values LPAREN expr_default_list RPAREN on_duplicate_opt'''
499
500
501
502
503def p_col_name_expr_default_list(p):
504 '''col_name_expr_default_list : col_name EQUAL expr_default COMMA col_name_expr_default_list
505 | col_name EQUAL expr_default'''
506
507 if(len(p) <= 4):
508 p[0]= [ColumnNameExprPair(p[1],p[3])];
509
510 else:
511 p[0]= [ColumnNameExprPair(p[1],p[3])] + p[5]
512
513
403def p_empty(p):514def p_empty(p):
404 'empty : '515 'empty : '
405 pass # an empty rule that represents an optional516 pass # an empty rule that represents an optional
406517
=== modified file 'movetodrizzle/helpers/statement_nodes.py'
--- movetodrizzle/helpers/statement_nodes.py 2010-07-23 00:09:44 +0000
+++ movetodrizzle/helpers/statement_nodes.py 2010-07-26 17:08:46 +0000
@@ -21,14 +21,14 @@
2121
22class DataTypeDesc():22class DataTypeDesc():
23 def __init__(self, data_type, length= None, decimals= None, unsigned= None, zerofill= None, charset_name= None, collate_name= None, binary= None):23 def __init__(self, data_type, length= None, decimals= None, unsigned= None, zerofill= None, charset_name= None, collate_name= None, binary= None):
24 self.data_type= data_type;24 self.data_type= data_type
25 self.length= length;25 self.length= length
26 self.unsigned= unsigned;26 self.unsigned= unsigned
27 self.zerofill= zerofill;27 self.zerofill= zerofill
28 self.decimals= decimals;28 self.decimals= decimals
29 self.collation_name= collate_name;29 self.collation_name= collate_name
30 self.charset_name= charset_name;30 self.charset_name= charset_name
31 self.binary= binary;31 self.binary= binary
3232
33 def __repr__(self):33 def __repr__(self):
34 return "DataTypeDesc(data_type= %s, length= %s, decimals= %s, zerofill= %s, unsigned= %s, collation_name= %s, charset_name= %s, binary= %s)" %(34 return "DataTypeDesc(data_type= %s, length= %s, decimals= %s, zerofill= %s, unsigned= %s, collation_name= %s, charset_name= %s, binary= %s)" %(
@@ -43,14 +43,14 @@
4343
44class ColumnDefinition():44class ColumnDefinition():
45 def __init__(self, name, data_type_desc, nullable= True, default= None, auto_increment= False, unique= False, primary_key= False, comment= None):45 def __init__(self, name, data_type_desc, nullable= True, default= None, auto_increment= False, unique= False, primary_key= False, comment= None):
46 self.name= name;46 self.name= name
47 self.data_type_desc= data_type_desc;47 self.data_type_desc= data_type_desc
48 self.nullable= nullable;48 self.nullable= nullable
49 self.default= default;49 self.default= default
50 self.auto_increment= auto_increment;50 self.auto_increment= auto_increment
51 self.unique= unique;51 self.unique= unique
52 self.primary_key= primary_key;52 self.primary_key= primary_key
53 self.comment= comment;53 self.comment= comment
54 def __repr__(self):54 def __repr__(self):
55 return "Column(col_name= %s, data_type_desc= %s, nullable= %s, default= %s, auto_increment= %s, unique= %s, primary_key= %s, comment= %s)" % (55 return "Column(col_name= %s, data_type_desc= %s, nullable= %s, default= %s, auto_increment= %s, unique= %s, primary_key= %s, comment= %s)" % (
56 self.name,56 self.name,
@@ -66,16 +66,16 @@
66class Identifier():66class Identifier():
67 def __init__(self, name, qualifier= None):67 def __init__(self, name, qualifier= None):
68 self.name= name68 self.name= name
69 self.qualifier= qualifier;69 self.qualifier= qualifier
70 def __repr__(self):70 def __repr__(self):
71 return "Identifier(name= %s, qualifier= %s)" % (self.name, str(self.qualifier))71 return "Identifier(name= %s, qualifier= %s)" % (self.name, str(self.qualifier))
7272
73class ForeignKeyConstraint():73class ForeignKeyConstraint():
74 def __init__(self, constarint_name, index_name, parent_fields, reference):74 def __init__(self, constarint_name, index_name, parent_fields, reference):
75 self.constarint_name= constarint_name;75 self.constarint_name= constarint_name
76 self.index_name= index_name;76 self.index_name= index_name
77 self.reference= reference;77 self.reference= reference
78 self.parent_fields= parent_fields;78 self.parent_fields= parent_fields
79 def __repr__(self):79 def __repr__(self):
80 return "ForeignKeyConstraint(constraint_name= %s, index_name= %s, parent_fields= %s, reference= %s)" %(self.constarint_name, self.index_name, self.parent_fields, self.reference)80 return "ForeignKeyConstraint(constraint_name= %s, index_name= %s, parent_fields= %s, reference= %s)" %(self.constarint_name, self.index_name, self.parent_fields, self.reference)
8181
@@ -84,19 +84,45 @@
84 self.name= name84 self.name= name
85 self.col_name_list= col_name_list85 self.col_name_list= col_name_list
86 self.match_option= match_option86 self.match_option= match_option
87 self.on_update= on_update;87 self.on_update= on_update
88 self.on_delete= on_delete;88 self.on_delete= on_delete
89 def __repr__(self):89 def __repr__(self):
90 return "Reference(name= %s, col_name_list= %s, match_option= %s, on_delete= %s, on_update= %s)" %(self.name, self.col_name_list, self.match_option, self.on_delete, self.on_update);90 return "Reference(name= %s, col_name_list= %s, match_option= %s, on_delete= %s, on_update= %s)" %(self.name, self.col_name_list, self.match_option, self.on_delete, self.on_update)
9191
92class CreateTableStatement(SqlStatement):92class CreateTableStatement(SqlStatement):
93 def __init__(self, table_name, list_columns, if_not_exists= False, temporary = False):93 def __init__(self, table_name, list_columns, if_not_exists= False, temporary = False):
94 self.table_name= table_name;94 self.table_name= table_name
95 self.temporary= temporary;95 self.temporary= temporary
96 self.if_not_exists= if_not_exists;96 self.if_not_exists= if_not_exists
97 self.columns= list_columns;97 self.columns= list_columns
98 self.table_options= {}98 self.table_options= {}
99 def update_table_options(self, options):99 def update_table_options(self, options):
100 self.table_options= options100 self.table_options= options
101 def __repr__(self):101 def __repr__(self):
102 return "CreateTableStatement(table= %s) (if_not_exists= %s) (temporary= %s) (columns= %s) (table_options= %s)" % (self.table_name, self.if_not_exists, self.temporary, str(self.columns),self.table_options)102 return "CreateTableStatement(table= %s) (if_not_exists= %s) (temporary= %s) (columns= %s) (table_options= %s)" % (self.table_name, self.if_not_exists, self.temporary, str(self.columns),self.table_options)
103
104class ColumnNameExprPair():
105 def __init__(self, col_name, expr):
106 self.column_name= col_name
107 self.expr= expr
108 def __repr__(self):
109 return "ColumnNameExprPair (column_name= %s, expr= %s)" %(self.column_name, self.expr)
110
111class InsertStatement(SqlStatement):
112 def __init__(self,priority, ignore, table_name, index_col_name_list, list_of_values, on_duplicate,set_list):
113 self.priority= priority
114 self.ignore= ignore
115 self.table_name= table_name
116 self.index_col_name_list= index_col_name_list
117 self.list_of_values= list_of_values
118 self.on_duplicate= on_duplicate
119 self.set_list= set_list
120 def __repr__(self):
121 return "InsertStatement(priority= %s, ignore= %s, table_name= %s, index_col_name_list= %s, list_of_values= %s, on_duplicate= %s, set_list= %s)" % (
122 self.priority,
123 self.ignore,
124 self.table_name,
125 self.index_col_name_list,
126 self.list_of_values,
127 self.on_duplicate,
128 self.set_list)
103129
=== added file 'tests/parser_insert_test.py'
--- tests/parser_insert_test.py 1970-01-01 00:00:00 +0000
+++ tests/parser_insert_test.py 2010-07-26 17:08:46 +0000
@@ -0,0 +1,190 @@
1#!/usr/bin/python
2import sys
3import unittest
4sys.path.append("../movetodrizzle")
5import helpers.parser as parser
6
7class Tester( unittest.TestCase ):
8 def test_insert_table_simple( self ):
9 sql = "INSERT INTO t1 values (21,22);"
10 statements = parser.parse_string ( sql )
11 ct = statements[0]
12 self.assertEqual( ct.priority, None )
13 self.assertEqual( ct.ignore, None )
14 self.assertEqual( ct.table_name, "t1" )
15 self.assertEqual( ct.index_col_name_list, None )
16 self.assertEqual( ct.list_of_values, [21, 22] )
17 self.assertEqual( ct.on_duplicate, None )
18 self.assertEqual( ct.set_list, None )
19
20 def test_insert_table_priority( self ):
21 sql = "INSERT LOW_PRIORITY INTO t1 values (21,22);"
22 statements = parser.parse_string ( sql )
23 ct = statements[0]
24 self.assertEqual( ct.priority, "LOW_PRIORITY" )
25 self.assertEqual( ct.ignore, None )
26 self.assertEqual( ct.table_name, "t1" )
27 self.assertEqual( ct.index_col_name_list, None )
28 self.assertEqual( ct.list_of_values, [21, 22] )
29 self.assertEqual( ct.on_duplicate, None )
30 self.assertEqual( ct.set_list, None )
31
32 def test_insert_table_priority_IGNORE( self ):
33 sql = "INSERT LOW_PRIORITY IGNORE INTO t1 values (21,22);"
34 statements = parser.parse_string ( sql )
35 ct = statements[0]
36 self.assertEqual( ct.priority, "LOW_PRIORITY" )
37 self.assertEqual( ct.ignore, "IGNORE" )
38 self.assertEqual( ct.table_name, "t1" )
39 self.assertEqual( ct.index_col_name_list, None )
40 self.assertEqual( ct.list_of_values, [21, 22] )
41 self.assertEqual( ct.on_duplicate, None )
42 self.assertEqual( ct.set_list, None )
43
44
45 def test_insert_table_priority_IGNORE( self ):
46 sql = "INSERT LOW_PRIORITY IGNORE INTO t1 values (21,22);"
47 statements = parser.parse_string ( sql )
48 ct = statements[0]
49 self.assertEqual( ct.priority, "LOW_PRIORITY" )
50 self.assertEqual( ct.ignore, "IGNORE" )
51 self.assertEqual( ct.table_name, "t1" )
52 self.assertEqual( ct.index_col_name_list, None )
53 self.assertEqual( ct.list_of_values, [21, 22] )
54 self.assertEqual( ct.on_duplicate, None )
55 self.assertEqual( ct.set_list, None )
56
57 def test_insert_table_priority_IGNORE_opt_column_list( self ):
58 sql = "INSERT LOW_PRIORITY IGNORE INTO t1 (a1,a2) values (21,22);"
59 statements = parser.parse_string ( sql )
60 ct = statements[0]
61 self.assertEqual( ct.priority, "LOW_PRIORITY" )
62 self.assertEqual( ct.ignore, "IGNORE" )
63 self.assertEqual( ct.table_name, "t1" )
64 self.assertEqual( ct.index_col_name_list, ['a1','a2'] )
65 self.assertEqual( ct.list_of_values, [21, 22] )
66 self.assertEqual( ct.on_duplicate, None )
67 self.assertEqual( ct.set_list, None )
68
69 def test_insert_table_column_list_on_duplicate(self):
70 sql = "INSERT INTO t1 (a1,a2) values (21,22) ON DUPLICATE KEY UPDATE b1=200, b2='abc', b3='some_value';"
71 statements = parser.parse_string ( sql )
72 ct = statements[0]
73 self.assertEqual( ct.priority, None )
74 self.assertEqual( ct.ignore, None )
75 self.assertEqual( ct.table_name, "t1" )
76 self.assertEqual( ct.index_col_name_list, ['a1','a2'] )
77 self.assertEqual( ct.list_of_values, [21, 22] )
78 self.assertEqual( ct.on_duplicate[0].column_name,"b1" )
79 self.assertEqual( ct.on_duplicate[0].expr,200 )
80 self.assertEqual( ct.on_duplicate[1].column_name,"b2" )
81 self.assertEqual( ct.on_duplicate[1].expr,'abc' )
82 self.assertEqual( ct.on_duplicate[2].column_name,"b3" )
83 self.assertEqual( ct.on_duplicate[2].expr,'some_value' )
84 self.assertEqual( ct.set_list, None )
85
86 def test_insert_table_set_basic_default( self ):
87 sql = "INSERT INTO t1 SET a1=DEFAULT;"
88 statements = parser.parse_string (sql)
89 ct = statements[0]
90 self.assertEqual( ct.priority, None )
91 self.assertEqual( ct.ignore, None )
92 self.assertEqual( ct.table_name, "t1" )
93 self.assertEqual( ct.index_col_name_list, None )
94 self.assertEqual( ct.list_of_values, None )
95 self.assertEqual( ct.on_duplicate, None )
96 self.assertEqual( ct.set_list[0].column_name, "a1" )
97 self.assertEqual( ct.set_list[0].expr, "DEFAULT" )
98
99
100 def test_insert_table_set_basic_string( self ):
101 sql = "INSERT INTO t1 SET a1='abc';"
102 statements = parser.parse_string ( sql )
103 ct = statements[0]
104 self.assertEqual( ct.priority, None )
105 self.assertEqual( ct.ignore, None )
106 self.assertEqual( ct.table_name, "t1" )
107 self.assertEqual( ct.index_col_name_list, None )
108 self.assertEqual( ct.list_of_values, None )
109 self.assertEqual( ct.on_duplicate, None )
110 self.assertEqual( ct.set_list[0].column_name, "a1" )
111 self.assertEqual( ct.set_list[0].expr, "abc" )
112
113
114 def test_insert_table_set_basic_number( self ):
115 sql = "INSERT INTO t1 SET a1=10;"
116 statements = parser.parse_string ( sql )
117 ct = statements[0]
118 self.assertEqual( ct.priority, None )
119 self.assertEqual( ct.ignore, None )
120 self.assertEqual( ct.table_name, "t1" )
121 self.assertEqual( ct.index_col_name_list, None )
122 self.assertEqual( ct.list_of_values, None )
123 self.assertEqual( ct.on_duplicate, None )
124 self.assertEqual( ct.set_list[0].column_name, "a1" )
125 self.assertEqual( ct.set_list[0].expr, 10 )
126
127 def test_insert_table_set_basic_number_PRIORITY_IGNORE( self ):
128 sql = "INSERT LOW_PRIORITY IGNORE INTO t1 SET a1=10;"
129 statements = parser.parse_string ( sql )
130 ct = statements[0]
131 self.assertEqual( ct.priority, "LOW_PRIORITY" )
132 self.assertEqual( ct.ignore, "IGNORE" )
133 self.assertEqual( ct.table_name, "t1" )
134 self.assertEqual( ct.index_col_name_list, None )
135 self.assertEqual( ct.list_of_values, None)
136 self.assertEqual( ct.on_duplicate, None )
137 self.assertEqual( ct.set_list[0].column_name, "a1" )
138 self.assertEqual( ct.set_list[0].expr, 10 )
139
140 def test_insert_table_set_multiple_number_string(self):
141 sql = "INSERT INTO t1 SET a1= 10,a2='abc',a3=DEFAULT;"
142 statements = parser.parse_string (sql)
143 ct = statements[0]
144 self.assertEqual( ct.priority, None )
145 self.assertEqual( ct.ignore, None )
146 self.assertEqual( ct.table_name, "t1" )
147 self.assertEqual( ct.index_col_name_list, None )
148 self.assertEqual( ct.list_of_values, None)
149 self.assertEqual( ct.on_duplicate, None )
150 self.assertEqual( ct.set_list[0].column_name, "a1" )
151 self.assertEqual( ct.set_list[0].expr, 10 )
152 self.assertEqual( ct.set_list[1].column_name, "a2" )
153 self.assertEqual( ct.set_list[1].expr, 'abc' )
154 self.assertEqual( ct.set_list[2].column_name, "a3" )
155 self.assertEqual( ct.set_list[2].expr, 'DEFAULT' )
156
157 def test_insert_table_set_basic_number_on_duplicate_single( self ):
158 sql = "INSERT INTO t1 SET a1=10 ON DUPLICATE KEY UPDATE b1=200;"
159 statements = parser.parse_string ( sql )
160 ct = statements[0]
161 self.assertEqual( ct.priority, None )
162 self.assertEqual( ct.ignore, None )
163 self.assertEqual( ct.table_name, "t1" )
164 self.assertEqual( ct.index_col_name_list, None )
165 self.assertEqual( ct.list_of_values, None )
166 self.assertEqual( ct.on_duplicate[0].column_name,"b1" )
167 self.assertEqual( ct.on_duplicate[0].expr,200 )
168 self.assertEqual( ct.set_list[0].column_name, "a1" )
169 self.assertEqual( ct.set_list[0].expr, 10 )
170
171 def test_insert_table_set_basic_number_on_duplicate_multiple( self ):
172 sql = "INSERT INTO t1 SET a1=10 ON DUPLICATE KEY UPDATE b1=200, b2='abc', b3='some_value';"
173 statements = parser.parse_string ( sql )
174 ct = statements[0]
175 self.assertEqual( ct.priority, None )
176 self.assertEqual( ct.ignore, None )
177 self.assertEqual( ct.table_name, "t1" )
178 self.assertEqual( ct.index_col_name_list, None )
179 self.assertEqual( ct.list_of_values, None)
180 self.assertEqual( ct.on_duplicate[0].column_name,"b1" )
181 self.assertEqual( ct.on_duplicate[0].expr,200 )
182 self.assertEqual( ct.on_duplicate[1].column_name,"b2" )
183 self.assertEqual( ct.on_duplicate[1].expr,'abc' )
184 self.assertEqual( ct.on_duplicate[2].column_name,"b3" )
185 self.assertEqual( ct.on_duplicate[2].expr,'some_value' )
186 self.assertEqual( ct.set_list[0].column_name, "a1" )
187 self.assertEqual( ct.set_list[0].expr, 10 )
188
189if __name__ == '__main__':
190 unittest.main()

Subscribers

People subscribed via source and target branches

to all changes: