vitess.io/vitess@v0.16.2/go/vt/external/golib/sqlutils/sqlite_dialect_test.go (about) 1 /* 2 Copyright 2017 GitHub Inc. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 /* 18 This file has been copied over from VTOrc package 19 */ 20 21 package sqlutils 22 23 import ( 24 "regexp" 25 "strings" 26 "testing" 27 28 "github.com/stretchr/testify/require" 29 ) 30 31 var spacesRegexp = regexp.MustCompile(`[\s]+`) 32 33 func init() { 34 } 35 36 func stripSpaces(statement string) string { 37 statement = strings.TrimSpace(statement) 38 statement = spacesRegexp.ReplaceAllString(statement, " ") 39 return statement 40 } 41 42 func TestIsCreateTable(t *testing.T) { 43 require.True(t, IsCreateTable("create table t(id int)")) 44 require.True(t, IsCreateTable(" create table t(id int)")) 45 require.True(t, IsCreateTable("CREATE TABLE t(id int)")) 46 require.True(t, IsCreateTable(` 47 create table t(id int) 48 `)) 49 require.False(t, IsCreateTable("where create table t(id int)")) 50 require.False(t, IsCreateTable("insert")) 51 } 52 53 func TestToSqlite3CreateTable(t *testing.T) { 54 { 55 statement := "create table t(id int)" 56 result := ToSqlite3CreateTable(statement) 57 require.Equal(t, result, statement) 58 } 59 { 60 statement := "create table t(id int, v varchar(123) CHARACTER SET ascii NOT NULL default '')" 61 result := ToSqlite3CreateTable(statement) 62 require.Equal(t, result, "create table t(id int, v varchar(123) NOT NULL default '')") 63 } 64 { 65 statement := "create table t(id int, v varchar ( 123 ) CHARACTER SET ascii NOT NULL default '')" 66 result := ToSqlite3CreateTable(statement) 67 require.Equal(t, result, "create table t(id int, v varchar ( 123 ) NOT NULL default '')") 68 } 69 { 70 statement := "create table t(i smallint unsigned)" 71 result := ToSqlite3CreateTable(statement) 72 require.Equal(t, result, "create table t(i smallint)") 73 } 74 { 75 statement := "create table t(i smallint(5) unsigned)" 76 result := ToSqlite3CreateTable(statement) 77 require.Equal(t, result, "create table t(i smallint)") 78 } 79 { 80 statement := "create table t(i smallint ( 5 ) unsigned)" 81 result := ToSqlite3CreateTable(statement) 82 require.Equal(t, result, "create table t(i smallint)") 83 } 84 } 85 86 func TestToSqlite3AlterTable(t *testing.T) { 87 { 88 statement := ` 89 ALTER TABLE 90 database_instance 91 ADD COLUMN sql_delay INT UNSIGNED NOT NULL AFTER replica_lag_seconds 92 ` 93 result := stripSpaces(ToSqlite3Dialect(statement)) 94 require.Equal(t, result, stripSpaces(` 95 ALTER TABLE 96 database_instance 97 add column sql_delay int not null default 0 98 `)) 99 } 100 { 101 statement := ` 102 ALTER TABLE 103 database_instance 104 ADD INDEX source_host_port_idx (source_host, source_port) 105 ` 106 result := stripSpaces(ToSqlite3Dialect(statement)) 107 require.Equal(t, result, stripSpaces(` 108 create index 109 source_host_port_idx_database_instance 110 on database_instance (source_host, source_port) 111 `)) 112 } 113 { 114 statement := ` 115 ALTER TABLE 116 topology_recovery 117 ADD KEY last_detection_idx (last_detection_id) 118 ` 119 result := stripSpaces(ToSqlite3Dialect(statement)) 120 require.Equal(t, result, stripSpaces(` 121 create index 122 last_detection_idx_topology_recovery 123 on topology_recovery (last_detection_id) 124 `)) 125 } 126 127 } 128 129 func TestCreateIndex(t *testing.T) { 130 { 131 statement := ` 132 create index 133 source_host_port_idx_database_instance 134 on database_instance (source_host(128), source_port) 135 ` 136 result := stripSpaces(ToSqlite3Dialect(statement)) 137 require.Equal(t, result, stripSpaces(` 138 create index 139 source_host_port_idx_database_instance 140 on database_instance (source_host, source_port) 141 `)) 142 } 143 } 144 145 func TestIsInsert(t *testing.T) { 146 require.True(t, IsInsert("insert into t")) 147 require.True(t, IsInsert("insert ignore into t")) 148 require.True(t, IsInsert(` 149 insert ignore into t 150 `)) 151 require.False(t, IsInsert("where create table t(id int)")) 152 require.False(t, IsInsert("create table t(id int)")) 153 require.True(t, IsInsert(` 154 insert into 155 cluster_domain_name (cluster_name, domain_name, last_registered) 156 values 157 (?, ?, datetime('now')) 158 on duplicate key update 159 domain_name=values(domain_name), 160 last_registered=values(last_registered) 161 `)) 162 } 163 164 func TestToSqlite3Insert(t *testing.T) { 165 { 166 statement := ` 167 insert into 168 cluster_domain_name (cluster_name, domain_name, last_registered) 169 values 170 (?, ?, datetime('now')) 171 on duplicate key update 172 domain_name=values(domain_name), 173 last_registered=values(last_registered) 174 ` 175 result := stripSpaces(ToSqlite3Dialect(statement)) 176 require.Equal(t, result, stripSpaces(` 177 replace into 178 cluster_domain_name (cluster_name, domain_name, last_registered) 179 values 180 (?, ?, datetime('now')) 181 `)) 182 } 183 } 184 185 func TestToSqlite3GeneralConversions(t *testing.T) { 186 { 187 statement := "select now()" 188 result := ToSqlite3Dialect(statement) 189 require.Equal(t, result, "select datetime('now')") 190 } 191 { 192 statement := "select now() - interval ? second" 193 result := ToSqlite3Dialect(statement) 194 require.Equal(t, result, "select datetime('now', printf('-%d second', ?))") 195 } 196 { 197 statement := "select now() + interval ? minute" 198 result := ToSqlite3Dialect(statement) 199 require.Equal(t, result, "select datetime('now', printf('+%d minute', ?))") 200 } 201 { 202 statement := "select now() + interval 5 minute" 203 result := ToSqlite3Dialect(statement) 204 require.Equal(t, result, "select datetime('now', '+5 minute')") 205 } 206 { 207 statement := "select some_table.some_column + interval ? minute" 208 result := ToSqlite3Dialect(statement) 209 require.Equal(t, result, "select datetime(some_table.some_column, printf('+%d minute', ?))") 210 } 211 { 212 statement := "AND primary_instance.last_attempted_check <= primary_instance.last_seen + interval ? minute" 213 result := ToSqlite3Dialect(statement) 214 require.Equal(t, result, "AND primary_instance.last_attempted_check <= datetime(primary_instance.last_seen, printf('+%d minute', ?))") 215 } 216 { 217 statement := "select concat(primary_instance.port, '') as port" 218 result := ToSqlite3Dialect(statement) 219 require.Equal(t, result, "select (primary_instance.port || '') as port") 220 } 221 { 222 statement := "select concat( 'abc' , 'def') as s" 223 result := ToSqlite3Dialect(statement) 224 require.Equal(t, result, "select ('abc' || 'def') as s") 225 } 226 { 227 statement := "select concat( 'abc' , 'def', last.col) as s" 228 result := ToSqlite3Dialect(statement) 229 require.Equal(t, result, "select ('abc' || 'def' || last.col) as s") 230 } 231 { 232 statement := "select concat(myself.only) as s" 233 result := ToSqlite3Dialect(statement) 234 require.Equal(t, result, "select concat(myself.only) as s") 235 } 236 { 237 statement := "select concat(1, '2', 3, '4') as s" 238 result := ToSqlite3Dialect(statement) 239 require.Equal(t, result, "select concat(1, '2', 3, '4') as s") 240 } 241 { 242 statement := "select group_concat( 'abc' , 'def') as s" 243 result := ToSqlite3Dialect(statement) 244 require.Equal(t, result, "select group_concat( 'abc' , 'def') as s") 245 } 246 }