bytes('\'text1\'', encoding),
                    len(bytes('\'text2\'', encoding)),
                    bytes('\'text2\'', encoding),
                    len(bytes('\'text3\'', encoding)),
                    bytes('\'text3\'', encoding)))
    # warning: the data in batch must be sorted by time
    times.extend(struct.pack(time_pack_str, 2, 3, 4))
    resp = client.insertBatch(
        TSBatchInsertionReq(sessionId, deviceId, measurements, values, times,
                            dataTypes, rowCnt))
    status = resp.status
    print(status.statusType)

    # execute deletion (or other statements)
    resp = client.executeStatement(
        TSExecuteStatementReq(sessionId, "DELETE FROM "
                              "root.group1 where time < 2", stmtId))
    status = resp.status
    print(status.statusType)

    # query the data
    stmt = "SELECT * FROM root.group1"
    fetchSize = 2
    # this is also for resource control, make sure different queries will not use the same id at the same time
    resp = client.executeQueryStatement(
        TSExecuteStatementReq(sessionId, stmt, stmtId))
    # headers
    dataTypeList = resp.dataTypeList
    print(resp.columns)
    print(dataTypeList)
                    len(bytes('\'text1\'', encoding)),
                    bytes('\'text1\'', encoding),
                    len(bytes('\'text2\'', encoding)),
                    bytes('\'text2\'', encoding),
                    len(bytes('\'text3\'', encoding)),
                    bytes('\'text3\'', encoding)))
    times.extend(struct.pack(time_pack_str, 2, 3, 4))
    resp = client.insertBatch(
        TSBatchInsertionReq(deviceId, measurements, values, times, dataTypes,
                            rowCnt))
    status = resp.status
    print(status.statusType)

    # execute deletion (or other statements)
    resp = client.executeStatement(
        TSExecuteStatementReq(handle, "DELETE FROM root.group1 where time < 2",
                              stmtId))
    status = resp.status
    print(status.statusType)

    # query the data
    stmt = "SELECT * FROM root.group1"
    fetchSize = 2
    # this is also for resource control, make sure different queries will not use the same id at the same time
    resp = client.executeQueryStatement(
        TSExecuteStatementReq(handle, stmt, stmtId))
    # headers
    dataTypeList = resp.dataTypeList
    print(resp.columns)
    print(dataTypeList)