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  }