1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
use strict;
use warnings;
use Test::More;
use SQL::Tokenizer;
use constant SPACE => ' ';
use constant COMMA => ',';
use constant NL => "\n";
my $query;
my @query;
my @tokenized;
my @tests = (
{
description => qq{one C style scaped double quote},
query =>
"INSERT INTO table VALUES( \"scaped \\\" double quote\", \"no quote\" )",
wanted => [
'INSERT', SPACE,
'INTO', SPACE,
'table', SPACE,
'VALUES', '(',
SPACE, q{"scaped \" double quote"},
COMMA, SPACE,
q{"no quote"}, SPACE,
')'
],
},
{
description => qq{no quotes inside string},
query =>
"INSERT INTO table VALUES( \"no quote\", \"no quote either\" )",
wanted => [
'INSERT', SPACE,
'INTO', SPACE,
'table', SPACE,
'VALUES', '(',
SPACE, q{"no quote"},
COMMA, SPACE,
q{"no quote either"}, SPACE,
')'
],
},
{
description =>
qq{more than one C style escaped double quotes inside string},
query =>
q{INSERT INTO logs (program, message) VALUES (:program, "Something \" with \" a \" lot \" of \" scaped quotes")},
wanted => [
'INSERT', SPACE, 'INTO', SPACE,
'logs', SPACE, '(', 'program',
COMMA, SPACE, 'message', ')',
SPACE, 'VALUES', SPACE, '(',
':program', COMMA, SPACE,
q{"Something \" with \" a \" lot \" of \" scaped quotes"},
')'
],
},
{
description => qq{SQL style escaped double quotes},
query => q{INSERT INTO logs (program) VALUES ("double""quote")},
wanted => [
'INSERT', SPACE, 'INTO', SPACE, 'logs', SPACE, '(', 'program', ')',
SPACE, 'VALUES', SPACE, '(', q{"double""quote"}, ')'
],
},
{
description =>
qq{SQL style escaped double quotes with surrounding spaces},
query => q{INSERT INTO logs (program) VALUES ("double "" quote "" ")},
wanted => [
'INSERT', SPACE, 'INTO', SPACE, 'logs', SPACE, '(', 'program', ')',
SPACE, 'VALUES', SPACE, '(', q{"double "" quote "" "}, ')'
],
},
{
description => qq{C style escaped double quote at end of string},
query => q{INSERT INTO logs (program) VALUES ("single "" quote \"")},
wanted => [
'INSERT', SPACE, 'INTO', SPACE, 'logs', SPACE, '(', 'program', ')',
SPACE, 'VALUES', SPACE, '(', q{"single "" quote \""}, ')'
],
},
{
description =>
qq{multiple SQL style escaped double quotes at end of string},
query => qq{INSERT INTO logs (program) VALUES ("double "" quote """"")},
wanted => [
'INSERT', SPACE, 'INTO', SPACE, 'logs', SPACE, '(', 'program', ')',
SPACE, 'VALUES', SPACE, '(', qq{"double "" quote """""}, ')'
],
},
);
plan tests => scalar @tests;
foreach my $test (@tests) {
my @tokenized = SQL::Tokenizer->tokenize( $test->{query} );
is_deeply( \@tokenized, $test->{wanted}, $test->{description} );
}
|