Skip to content

Commit

Permalink
Fix bind for seconds scale DateTime (#1184)
Browse files Browse the repository at this point in the history
* fixing timezone problem

* Add test case and fix statement generation

---------

Co-authored-by: Devop- <eyupsaral.dev@gmail.com>
Co-authored-by: Eyüp SARAL <127626139+Eyup-Devop@users.noreply.github.com>
  • Loading branch information
3 people committed Jan 29, 2024
1 parent 5bd511d commit 8aac443
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 3 deletions.
8 changes: 5 additions & 3 deletions bind.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,10 @@ func DateNamed(name string, value time.Time, scale TimeUnit) driver.NamedDateVal
}
}

var bindNumericRe = regexp.MustCompile(`\$[0-9]+`)
var bindPositionalRe = regexp.MustCompile(`[^\\][?]`)
var (
bindNumericRe = regexp.MustCompile(`\$[0-9]+`)
bindPositionalRe = regexp.MustCompile(`[^\\][?]`)
)

func bind(tz *time.Location, query string, args ...any) (string, error) {
if len(args) == 0 {
Expand Down Expand Up @@ -262,7 +264,7 @@ func formatTime(tz *time.Location, scale TimeUnit, value time.Time) (string, err
return fmt.Sprintf("toDateTime64('%s', %d)", value.Format(fmt.Sprintf("2006-01-02 15:04:05.%0*d", int(scale*3), 0)), int(scale*3)), nil
}
if scale == Seconds {
return value.Format(fmt.Sprintf("toDateTime('2006-01-02 15:04:05', '%s')", value.Location().String())), nil
return fmt.Sprintf("toDateTime('%s', '%s')", value.Format("2006-01-02 15:04:05"), value.Location().String()), nil
}
return fmt.Sprintf("toDateTime64('%s', %d, '%s')", value.Format(fmt.Sprintf("2006-01-02 15:04:05.%0*d", int(scale*3), 0)), int(scale*3), value.Location().String()), nil
}
Expand Down
42 changes: 42 additions & 0 deletions tests/issues/1169_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package issues

import (
"context"
"testing"
"time"

"github.com/ClickHouse/clickhouse-go/v2"
clickhouse_tests "github.com/ClickHouse/clickhouse-go/v2/tests"
"github.com/stretchr/testify/require"
)

func Test1169(t *testing.T) {
var (
conn, err = clickhouse_tests.GetConnection("issues", clickhouse.Settings{
"max_execution_time": 60,
"allow_experimental_object_type": true,
}, nil, &clickhouse.Compression{
Method: clickhouse.CompressionLZ4,
})
)
ctx := context.Background()
require.NoError(t, err)
const ddl = "CREATE TABLE test_1169 (Col1 DateTime) Engine MergeTree() ORDER BY tuple()"
require.NoError(t, conn.Exec(ctx, ddl))
defer func() {
conn.Exec(ctx, "DROP TABLE IF EXISTS test_1169")
}()

location := time.FixedZone("Etc/GMT+2", -int(time.Hour*2/time.Second))
date, err := time.ParseInLocation("2006-01-02 15:04:05", "2024-01-03 11:22:33", location)
require.NoError(t, err)

err = conn.Exec(ctx, "INSERT INTO test_1169 (Col1) VALUES (?)", date)
require.NoError(t, err)

// select
var actualDate time.Time
err = conn.QueryRow(ctx, "SELECT Col1 FROM test_1169").Scan(&actualDate)
require.NoError(t, err)
require.Equal(t, actualDate.In(location), date)
}

0 comments on commit 8aac443

Please sign in to comment.