1use strict; 2use warnings; 3 4use Test::More; 5 6use SQL::Tokenizer; 7 8use constant SPACE => ' '; 9use constant COMMA => ','; 10use constant NL => "\n"; 11 12my $query; 13my @query; 14my @tokenized; 15 16my @tests = ( 17 { 18 description => q{C style comment}, 19 query => <<COMPLEX_SQL, 20/* drop table */ 21DROP TABLE test; 22/* create table */ 23CREATE TABLE test (id INT, name VARCHAR); 24/* insert data */ 25INSERT INTO test (id, name) VALUES (1, 't'); 26INSERT INTO test (id, name) VALUES (2, '''quoted'''); 27COMPLEX_SQL 28 29 wanted => [ 30 q{/* drop table */}, NL, 31 'DROP', SPACE, 32 'TABLE', SPACE, 33 'test', ';', 34 NL, q{/* create table */}, 35 NL, 'CREATE', 36 SPACE, 'TABLE', 37 SPACE, 'test', 38 SPACE, '(', 39 'id', SPACE, 40 'INT', COMMA, 41 SPACE, 'name', 42 SPACE, 'VARCHAR', 43 ')', ';', 44 NL, q{/* insert data */}, 45 NL, 'INSERT', 46 SPACE, 'INTO', 47 SPACE, 'test', 48 SPACE, '(', 49 'id', COMMA, 50 SPACE, 'name', 51 ')', SPACE, 52 'VALUES', SPACE, 53 '(', '1', 54 COMMA, SPACE, 55 q{'t'}, ')', 56 ';', NL, 57 'INSERT', SPACE, 58 'INTO', SPACE, 59 'test', SPACE, 60 '(', 'id', 61 COMMA, SPACE, 62 'name', ')', 63 SPACE, 'VALUES', 64 SPACE, '(', 65 '2', COMMA, 66 SPACE, q{'''quoted'''}, 67 ')', ';', 68 NL, 69 ], 70 }, 71 { 72 description => q{multi-line C style comment}, 73 query => <<COMPLEX_SQL, 74/* 75 drop table 76*/ 77DROP TABLE test; 78/* 79 create table 80*/ 81CREATE TABLE test (id INT, name VARCHAR); 82/* 83 insert data 84*/ 85INSERT INTO test (id, name) VALUES (1, 't'); 86INSERT INTO test (id, name) VALUES (2, '''quoted'''); 87COMPLEX_SQL 88 89 wanted => [ 90 qq{/*\n drop table\n*/}, NL, 91 'DROP', SPACE, 92 'TABLE', SPACE, 93 'test', ';', 94 NL, qq{/*\n create table\n*/}, 95 NL, 'CREATE', 96 SPACE, 'TABLE', 97 SPACE, 'test', 98 SPACE, '(', 99 'id', SPACE, 100 'INT', COMMA, 101 SPACE, 'name', 102 SPACE, 'VARCHAR', 103 ')', ';', 104 NL, qq{/*\n insert data\n*/}, 105 NL, 'INSERT', 106 SPACE, 'INTO', 107 SPACE, 'test', 108 SPACE, '(', 109 'id', COMMA, 110 SPACE, 'name', 111 ')', SPACE, 112 'VALUES', SPACE, 113 '(', '1', 114 COMMA, SPACE, 115 q{'t'}, ')', 116 ';', NL, 117 'INSERT', SPACE, 118 'INTO', SPACE, 119 'test', SPACE, 120 '(', 'id', 121 COMMA, SPACE, 122 'name', ')', 123 SPACE, 'VALUES', 124 SPACE, '(', 125 '2', COMMA, 126 SPACE, q{'''quoted'''}, 127 ')', ';', 128 NL, 129 ], 130 }, 131 { 132 description => q{multi-line C style comment with CR+LF newline}, 133 query => <<COMPLEX_SQL, 134/*\r 135 drop table\r 136*/\r 137DROP TABLE test;\r 138/*\r 139 create table\r 140*/\r 141CREATE TABLE test (id INT, name VARCHAR);\r 142/*\r 143 insert data\r 144*/\r 145INSERT INTO test (id, name) VALUES (1, 't');\r 146INSERT INTO test (id, name) VALUES (2, '''quoted''');\r 147COMPLEX_SQL 148 149 wanted => [ 150 qq{/*\r\n drop table\r\n*/}, NL, 151 'DROP', SPACE, 152 'TABLE', SPACE, 153 'test', ';', 154 NL, qq{/*\r\n create table\r\n*/}, 155 NL, 'CREATE', 156 SPACE, 'TABLE', 157 SPACE, 'test', 158 SPACE, '(', 159 'id', SPACE, 160 'INT', COMMA, 161 SPACE, 'name', 162 SPACE, 'VARCHAR', 163 ')', ';', 164 NL, qq{/*\r\n insert data\r\n*/}, 165 NL, 'INSERT', 166 SPACE, 'INTO', 167 SPACE, 'test', 168 SPACE, '(', 169 'id', COMMA, 170 SPACE, 'name', 171 ')', SPACE, 172 'VALUES', SPACE, 173 '(', '1', 174 COMMA, SPACE, 175 q{'t'}, ')', 176 ';', NL, 177 'INSERT', SPACE, 178 'INTO', SPACE, 179 'test', SPACE, 180 '(', 'id', 181 COMMA, SPACE, 182 'name', ')', 183 SPACE, 'VALUES', 184 SPACE, '(', 185 '2', COMMA, 186 SPACE, q{'''quoted'''}, 187 ')', ';', 188 NL, 189 ], 190 }, 191); 192 193plan tests => scalar @tests; 194 195foreach my $test (@tests) { 196 my @tokenized = SQL::Tokenizer->tokenize( $test->{query} ); 197 is_deeply( \@tokenized, $test->{wanted}, $test->{description} ); 198} 199