162 lines
4.9 KiB
Python
162 lines
4.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import random
|
|
import string
|
|
import subprocess
|
|
import sys
|
|
from util.log import *
|
|
from util.cases import *
|
|
from util.sql import *
|
|
|
|
|
|
class TDTestCase:
|
|
def init( self, conn ):
|
|
tdLog.debug("start to execute %s" % __file__)
|
|
tdSql.init(conn.cursor())
|
|
|
|
|
|
def getLimitFromSourceCode( self, name ):
|
|
cmd = "grep -w '#define %s' ../../src/inc/taosdef.h|awk '{print $3}'" % name
|
|
return int(subprocess.check_output(cmd, shell=True))
|
|
|
|
|
|
def generateString( self, length ):
|
|
chars = string.ascii_uppercase + string.ascii_lowercase
|
|
v = ""
|
|
for i in range( length ):
|
|
v += random.choice( chars )
|
|
return v
|
|
|
|
|
|
def checkTagBoundaries( self ):
|
|
tdLog.debug( "checking tag boundaries" )
|
|
tdSql.prepare()
|
|
|
|
maxTags = self.getLimitFromSourceCode( 'TSDB_MAX_TAGS' )
|
|
totalTagsLen = self.getLimitFromSourceCode( 'TSDB_MAX_TAGS_LEN' )
|
|
tdLog.notice( "max tags is %d" % maxTags )
|
|
tdLog.notice( "max total tag length is %d" % totalTagsLen )
|
|
|
|
# for binary tags, 2 bytes are used for length
|
|
tagLen = (totalTagsLen - maxTags * 2) // maxTags
|
|
firstTagLen = totalTagsLen - 2 * maxTags - tagLen * (maxTags - 1)
|
|
|
|
sql = "create table cars(ts timestamp, f int) tags(t0 binary(%d)" % firstTagLen
|
|
for i in range( 1, maxTags ):
|
|
sql += ", t%d binary(%d)" % (i, tagLen)
|
|
sql += ");"
|
|
|
|
tdLog.debug( "creating super table: " + sql )
|
|
tdSql.execute( sql )
|
|
tdSql.query( 'show stables' )
|
|
tdSql.checkRows( 1 )
|
|
|
|
for i in range( 10 ):
|
|
sql = "create table car%d using cars tags('%d'" % (i, i)
|
|
sql += ", '0'" * (maxTags - 1) + ");"
|
|
tdLog.debug( "creating table: " + sql )
|
|
tdSql.execute( sql )
|
|
|
|
sql = "insert into car%d values(now, 0);" % i
|
|
tdLog.debug( "inserting data: " + sql )
|
|
tdSql.execute( sql )
|
|
|
|
tdSql.query( 'show tables' )
|
|
tdLog.info( 'tdSql.checkRow(10)' )
|
|
tdSql.checkRows( 10 )
|
|
|
|
tdSql.query( 'select * from cars;' )
|
|
tdSql.checkRows( 10 )
|
|
|
|
|
|
def checkColumnBoundaries( self ):
|
|
tdLog.debug( "checking column boundaries" )
|
|
tdSql.prepare()
|
|
|
|
# one column is for timestamp
|
|
maxCols = self.getLimitFromSourceCode( 'TSDB_MAX_COLUMNS' ) - 1
|
|
|
|
sql = "create table cars (ts timestamp"
|
|
for i in range( maxCols ):
|
|
sql += ", c%d int" % i
|
|
sql += ");"
|
|
tdSql.execute( sql )
|
|
tdSql.query( 'show tables' )
|
|
tdSql.checkRows( 1 )
|
|
|
|
sql = "insert into cars values (now"
|
|
for i in range( maxCols ):
|
|
sql += ", %d" % i
|
|
sql += ");"
|
|
tdSql.execute( sql )
|
|
tdSql.query( 'select * from cars' )
|
|
tdSql.checkRows( 1 )
|
|
|
|
|
|
def checkTableNameBoundaries( self ):
|
|
tdLog.debug( "checking table name boundaries" )
|
|
tdSql.prepare()
|
|
|
|
maxTableNameLen = self.getLimitFromSourceCode( 'TSDB_TABLE_NAME_LEN' )
|
|
tdLog.notice( "table name max length is %d" % maxTableNameLen )
|
|
|
|
name = self.generateString( maxTableNameLen - 1)
|
|
tdLog.info( "table name is '%s'" % name )
|
|
|
|
tdSql.execute( "create table %s (ts timestamp, value int)" % name )
|
|
tdSql.execute( "insert into %s values(now, 0)" % name )
|
|
|
|
tdSql.query( 'show tables' )
|
|
tdSql.checkRows( 1 )
|
|
|
|
tdSql.query( 'select * from %s' % name )
|
|
tdSql.checkRows( 1 )
|
|
|
|
|
|
def checkRowBoundaries( self ):
|
|
tdLog.debug( "checking row boundaries" )
|
|
tdSql.prepare()
|
|
|
|
# 8 bytes for timestamp
|
|
maxRowSize = 65536 - 8
|
|
maxCols = self.getLimitFromSourceCode( 'TSDB_MAX_COLUMNS' ) - 1
|
|
|
|
# for binary cols, 2 bytes are used for length
|
|
colLen = (maxRowSize - maxCols * 2) // maxCols
|
|
firstColLen = maxRowSize - 2 * maxCols - colLen * (maxCols - 1)
|
|
|
|
sql = "create table cars (ts timestamp, c0 binary(%d)" % firstColLen
|
|
for i in range( 1, maxCols ):
|
|
sql += ", c%d binary(%d)" % (i, colLen)
|
|
sql += ");"
|
|
tdSql.execute( sql )
|
|
tdSql.query( 'show tables' )
|
|
tdSql.checkRows( 1 )
|
|
|
|
col = self.generateString( firstColLen )
|
|
sql = "insert into cars values (now, '%s'" % col
|
|
col = self.generateString( colLen )
|
|
for i in range( 1, maxCols ):
|
|
sql += ", '%s'" % col
|
|
sql += ");"
|
|
tdLog.info( sql );
|
|
tdSql.execute( sql )
|
|
tdSql.query( "select * from cars" )
|
|
tdSql.checkRows( 1 )
|
|
|
|
|
|
def run(self):
|
|
self.checkTagBoundaries()
|
|
self.checkColumnBoundaries()
|
|
self.checkTableNameBoundaries()
|
|
self.checkRowBoundaries()
|
|
|
|
|
|
def stop(self):
|
|
tdSql.close()
|
|
tdLog.success("%s successfully executed" % __file__)
|
|
|
|
|
|
tdCases.addWindows(__file__, TDTestCase())
|
|
tdCases.addLinux(__file__, TDTestCase())
|