blob: cc6ee2069096025def0ca431872ddd6b8136c1a8 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package iotdb_go
import (
"context"
"database/sql/driver"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// TestValuesToNamedValues verifies the legacy []driver.Value adapter assigns
// 1-based ordinals. Pure logic, no server required.
func TestValuesToNamedValues(t *testing.T) {
got := valuesToNamedValues([]driver.Value{"a", int64(2), true})
require.Len(t, got, 3)
assert.Equal(t, driver.NamedValue{Ordinal: 1, Value: "a"}, got[0])
assert.Equal(t, driver.NamedValue{Ordinal: 2, Value: int64(2)}, got[1])
assert.Equal(t, driver.NamedValue{Ordinal: 3, Value: true}, got[2])
assert.Empty(t, valuesToNamedValues(nil))
}
// TestPrepare_ExecAndQuery verifies a prepared statement is usable end to end:
// it executes inserts and queries with bound parameters, and is reusable.
func TestPrepare_ExecAndQuery(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test in short mode")
}
sg := "root.prepare_test"
_, err := stdConn.ExecContext(context.Background(), "CREATE DATABASE "+sg)
require.NoError(t, err)
defer func() { _, _ = stdConn.ExecContext(context.Background(), "DELETE DATABASE "+sg) }()
_, err = stdConn.ExecContext(context.Background(),
"CREATE TIMESERIES "+sg+".d1.temp WITH DATATYPE=DOUBLE, ENCODING=PLAIN")
require.NoError(t, err)
// Prepared INSERT, reused for multiple rows.
insStmt, err := stdConn.PrepareContext(context.Background(),
"INSERT INTO "+sg+".d1(timestamp, temp) VALUES (?, ?)")
require.NoError(t, err)
defer insStmt.Close()
_, err = insStmt.ExecContext(context.Background(), 1, 10.5)
require.NoError(t, err)
_, err = insStmt.ExecContext(context.Background(), 2, 20.5)
require.NoError(t, err)
// Prepared SELECT.
selStmt, err := stdConn.PrepareContext(context.Background(),
"SELECT temp FROM "+sg+".d1 ORDER BY time ASC")
require.NoError(t, err)
defer selStmt.Close()
rows, err := selStmt.QueryContext(context.Background())
require.NoError(t, err)
defer rows.Close()
var got []float64
for rows.Next() {
var ts int64
var temp float64
require.NoError(t, rows.Scan(&ts, &temp))
got = append(got, temp)
}
require.NoError(t, rows.Err())
assert.Equal(t, []float64{10.5, 20.5}, got)
}
// TestPrepare_ReturnsUsableStmt verifies PrepareContext stores the query and
// returns a statement implementing the context-aware driver interfaces.
func TestPrepare_ReturnsUsableStmt(t *testing.T) {
stmt := &stdStmt{std: &stdDriver{}, query: "SELECT 1"}
var _ driver.Stmt = stmt
var _ driver.StmtExecContext = stmt
var _ driver.StmtQueryContext = stmt
assert.Equal(t, -1, stmt.NumInput())
assert.NoError(t, stmt.Close())
}