mirror of
https://github.com/MariaDB/server.git
synced 2025-02-02 12:01:42 +01:00
f66e34d0d7
git-svn-id: file:///svn/mysql/tests/mysql-test@55031 c7de825b-a66e-492c-adef-691d508d4ae1
203 lines
6.8 KiB
Python
203 lines
6.8 KiB
Python
import sys
|
|
import random
|
|
import string
|
|
import re
|
|
|
|
class Field:
|
|
def __init__(self, name, is_nullible):
|
|
self.name = name
|
|
self.is_nullible = is_nullible
|
|
|
|
class Field_int(Field):
|
|
sizes = [ 1, 2, 3, 4, 8 ]
|
|
types = [ "TINYINT", "SMALLINT", "MEDIUMINT", "INT", "BIGINT" ]
|
|
uint_ranges = [ (0,(1<<8)-1), (0,(1<<16)-1), (0,(1<<24)-1), (0,(1<<32)-1), (0,(1<<64)-1) ]
|
|
int_ranges = [ (-(1<<7), (1<<7)-1), (-(1<<15),(1<<15)-1), (-(1<<23),(1<<23)-1), (-(1<<31),(1<<31)-1), (-(1<<63),(1<<63)-1) ]
|
|
def __init__(self, name, size, is_unsigned, is_nullible):
|
|
Field.__init__(self, name, is_nullible)
|
|
self.idx = Field_int.sizes.index(size)
|
|
self.size = size
|
|
self.is_unsigned = is_unsigned
|
|
def get_type(self):
|
|
t = Field_int.types[self.idx]
|
|
if self.is_unsigned:
|
|
t += " UNSIGNED"
|
|
if not self.is_nullible:
|
|
t += " NOT NULL"
|
|
return t
|
|
def get_value(self):
|
|
if self.is_unsigned:
|
|
r = Field_int.uint_ranges[self.idx]
|
|
else:
|
|
r = Field_int.int_ranges[self.idx]
|
|
return random.randint(r[0],r[1])
|
|
def next_field(self):
|
|
return Field_int(self.name, Field_int.sizes[random.randint(self.idx,len(Field_int.sizes)-1)], self.is_unsigned, self.is_nullible)
|
|
|
|
class Field_int_auto_inc(Field_int):
|
|
def __init__(self, name, size, is_unsigned, is_nullible):
|
|
Field_int.__init__(self, name, size, is_unsigned, is_nullible)
|
|
self.next_value = 0
|
|
def get_type(self):
|
|
return Field_int.get_type(self)
|
|
def get_value(self):
|
|
v = self.next_value
|
|
self.next_value += 1
|
|
return v
|
|
|
|
class Field_char(Field):
|
|
types = [ "CHAR", "BINARY" ]
|
|
def __init__(self, name, size, is_binary, is_nullible):
|
|
Field.__init__(self, name, is_nullible)
|
|
assert 0 <= size and size < 256
|
|
self.size = size
|
|
self.is_binary = is_binary
|
|
def get_type(self):
|
|
t = "%s(%d)" % (Field_char.types[self.is_binary], self.size)
|
|
if not self.is_nullible:
|
|
t += " NOT NULL"
|
|
return t
|
|
def next_size(self):
|
|
if self.size < 255:
|
|
return self.size + 1
|
|
return self.size
|
|
def get_value(self):
|
|
l = random.randint(1, self.size)
|
|
s = ''.join(random.choice(string.ascii_lowercase + string.ascii_uppercase + string.digits) for x in range(l))
|
|
return "'%s'" % (s)
|
|
def next_field(self):
|
|
return Field_char(self.name, self.next_size(), self.is_binary, self.is_nullible)
|
|
|
|
class Field_varchar(Field):
|
|
types = [ "VARCHAR", "VARBINARY" ]
|
|
def __init__(self, name, size, is_binary, is_nullible):
|
|
Field.__init__(self, name, is_nullible)
|
|
assert 0 <= size and size < 64*1024
|
|
self.size= size
|
|
self.is_binary = is_binary
|
|
def get_type(self):
|
|
t = "%s(%d)" % (Field_varchar.types[self.is_binary], self.size)
|
|
if not self.is_nullible:
|
|
t += " NOT NULL"
|
|
return t;
|
|
def get_value(self):
|
|
l = random.randint(1, self.size)
|
|
s = ''.join(random.choice(string.ascii_lowercase + string.ascii_uppercase + string.digits) for x in range(l))
|
|
return "'%s'" % (s)
|
|
def next_size(self):
|
|
if self.size < 64*1024:
|
|
return self.size + 1
|
|
return self.size
|
|
def next_field(self):
|
|
if self.size < 256:
|
|
new_size = 256
|
|
else:
|
|
new_size = self.size + 1
|
|
return Field_varchar(self.name, new_size, self.is_binary, self.is_nullible)
|
|
|
|
class Field_blob(Field):
|
|
def __init__(self, name, size, is_nullible):
|
|
Field.__init__(self, name, is_nullible)
|
|
self.size = size
|
|
def get_type(self):
|
|
return "BLOB(%d)" % (self.size)
|
|
def get_value(self):
|
|
l = random.randint(1, self.size)
|
|
s = ''.join(random.choice(string.ascii_lowercase + string.ascii_uppercase + string.digits) for x in range(l))
|
|
return "'%s'" % (s)
|
|
|
|
def main():
|
|
experiments = 1000
|
|
nrows = 10
|
|
seed = 0
|
|
for arg in sys.argv[1:]:
|
|
match = re.match("--(.*)=(.*)", arg)
|
|
if match:
|
|
exec("%s = %s" % (match.group(1),match.group(2)))
|
|
random.seed(seed)
|
|
header()
|
|
for experiment in range(experiments):
|
|
# generate a schema
|
|
fields = create_fields()
|
|
|
|
# create a table with the schema
|
|
print create_table(fields)
|
|
|
|
# insert some rows
|
|
for r in range(nrows):
|
|
print insert_row(fields) % ('t')
|
|
print "CREATE TABLE ti LIKE t;"
|
|
print "ALTER TABLE ti ENGINE=myisam;"
|
|
print "INSERT INTO ti SELECT * FROM t;"
|
|
|
|
# transform table schema and contents
|
|
for f in [ 0, 2, 3, 5 ]:
|
|
fields[f] = fields[f].next_field()
|
|
print "ALTER TABLE t CHANGE COLUMN %s %s %s;" % (fields[f].name, fields[f].name, fields[f].get_type())
|
|
print "ALTER TABLE ti CHANGE COLUMN %s %s %s;" % (fields[f].name, fields[f].name, fields[f].get_type())
|
|
|
|
new_row = insert_row(fields)
|
|
print new_row % ('t')
|
|
print new_row % ('ti')
|
|
|
|
# compare tables
|
|
print "let $diff_tables = test.t, test.ti;"
|
|
print "source include/diff_tables.inc;"
|
|
|
|
# cleanup
|
|
print "DROP TABLE t, ti;"
|
|
print
|
|
return 0
|
|
|
|
def create_fields():
|
|
fields = []
|
|
fields.append(create_int('a'))
|
|
fields.append(create_int('b'))
|
|
fields.append(create_char('c'))
|
|
fields.append(create_varchar('d'))
|
|
fields.append(create_varchar('e'))
|
|
fields.append(create_varchar('f'))
|
|
fields.append(Field_blob('g', 100, 0))
|
|
fields.append(Field_blob('h', 100, 0))
|
|
fields.append(Field_int_auto_inc('id', 8, 0, 0))
|
|
return fields
|
|
|
|
def create_int(name):
|
|
int_sizes = [ 1, 2, 3, 4, 8]
|
|
return Field_int(name, int_sizes[random.randint(0,len(int_sizes)-1)], random.randint(0,1), random.randint(0,1))
|
|
|
|
def create_char(name):
|
|
return Field_char(name, random.randint(1, 100), random.randint(0,1), random.randint(0,1))
|
|
|
|
def create_varchar(name):
|
|
return Field_varchar(name, random.randint(1, 100), random.randint(0,1), random.randint(0,1))
|
|
|
|
def create_table(fields):
|
|
t = "CREATE TABLE t ("
|
|
for f in fields:
|
|
t += "%s %s, " % (f.name, f.get_type())
|
|
t += "KEY(b), CLUSTERING KEY(e), PRIMARY KEY(id)"
|
|
t += ");"
|
|
return t
|
|
|
|
def insert_row(fields):
|
|
t = "INSERT INTO %s VALUES ("
|
|
for i in range(len(fields)):
|
|
f = fields[i]
|
|
t += "%s" % (f.get_value())
|
|
if i < len(fields)-1:
|
|
t += ","
|
|
t += ");"
|
|
return t
|
|
|
|
def header():
|
|
print "# generated from change_all.py"
|
|
print "# test random column change on wide tables"
|
|
print "--disable_warnings"
|
|
print "DROP TABLE IF EXISTS t, ti;"
|
|
print "--enable_warnings"
|
|
print "SET SESSION TOKUDB_DISABLE_SLOW_ALTER=1;"
|
|
print "SET SESSION DEFAULT_STORAGE_ENGINE='TokuDB';"
|
|
print
|
|
|
|
sys.exit(main())
|