183 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			6.0 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, logSql):
 | 
						|
        tdLog.debug("start to execute %s" % __file__)
 | 
						|
        tdSql.init(conn.cursor(), logSql)
 | 
						|
 | 
						|
    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)
 | 
						|
 | 
						|
        # create a super table with name exceed max length
 | 
						|
        sname = self.generateString(maxTableNameLen)
 | 
						|
        tdLog.info("create a super table with length %d" % len(sname))
 | 
						|
        tdSql.error(
 | 
						|
            "create table %s (ts timestamp, value int) tags(id int)" %
 | 
						|
            sname)
 | 
						|
 | 
						|
        # create a super table with name of max length
 | 
						|
        sname = self.generateString(maxTableNameLen - 1)
 | 
						|
        tdLog.info("create a super table with length %d" % len(sname))
 | 
						|
        tdSql.execute(
 | 
						|
            "create table %s (ts timestamp, value int) tags(id int)" %
 | 
						|
            sname)
 | 
						|
        tdLog.info("check table count, should be one")
 | 
						|
        tdSql.query('show stables')
 | 
						|
        tdSql.checkRows(1)
 | 
						|
 | 
						|
        # create a child table with name exceed max length
 | 
						|
        name = self.generateString(maxTableNameLen)
 | 
						|
        tdLog.info("create a child table with length %d" % len(name))
 | 
						|
        tdSql.error("create table %s using %s tags(0)" % (name, sname))
 | 
						|
 | 
						|
        # create a child table with name of max length
 | 
						|
        name = self.generateString(maxTableNameLen - 1)
 | 
						|
        tdLog.info("create a child table with length %d" % len(name))
 | 
						|
        tdSql.execute("create table %s using %s tags(0)" % (name, sname))
 | 
						|
        tdSql.query('show tables')
 | 
						|
        tdSql.checkRows(1)
 | 
						|
 | 
						|
        # insert one row
 | 
						|
        tdLog.info("insert one row of data")
 | 
						|
        tdSql.execute("insert into %s values(now, 0)" % name)
 | 
						|
        tdSql.query("select * from " + name)
 | 
						|
        tdSql.checkRows(1)
 | 
						|
        tdSql.query("select * from " + sname)
 | 
						|
        tdSql.checkRows(1)
 | 
						|
 | 
						|
        name = name[:len(name) - 1]
 | 
						|
        tdSql.error("select * from " + name)
 | 
						|
        tdSql.checkRows(0)
 | 
						|
 | 
						|
    def checkRowBoundaries(self):
 | 
						|
        tdLog.debug("checking row boundaries")
 | 
						|
        tdSql.prepare()
 | 
						|
 | 
						|
        # 8 bytes for timestamp
 | 
						|
        maxRowSize = self.getLimitFromSourceCode('TSDB_MAX_BYTES_PER_ROW') - 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())
 |