diff options
author | Philip O'Toole <philip.otoole@yahoo.com> | 2021-02-17 21:58:21 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-18 11:58:21 +0900 |
commit | 95e88ca693fc3e9b392e4b7e7517968da3856a6d (patch) | |
tree | 104410461684399ec16ed945b0a11a2de7dd2752 | |
parent | Go get go-acc with environment variable for go modules (#915) (diff) | |
download | golite-95e88ca693fc3e9b392e4b7e7517968da3856a6d.tar.gz golite-95e88ca693fc3e9b392e4b7e7517968da3856a6d.tar.xz |
Export sqlite3_column_table_name (#900)
-rw-r--r-- | sqlite3.go | 9 | ||||
-rw-r--r-- | sqlite3_test.go | 34 |
2 files changed, 43 insertions, 0 deletions
@@ -19,6 +19,7 @@ package sqlite3 #cgo CFLAGS: -DSQLITE_OMIT_DEPRECATED #cgo CFLAGS: -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 #cgo CFLAGS: -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT +#cgo CFLAGS: -DSQLITE_ENABLE_COLUMN_METADATA #cgo CFLAGS: -Wno-deprecated-declarations #cgo linux,!android CFLAGS: -DHAVE_PREAD64=1 -DHAVE_PWRITE64=1 #ifndef USE_LIBSQLITE3 @@ -2014,6 +2015,14 @@ func (s *SQLiteStmt) Readonly() bool { return C.sqlite3_stmt_readonly(s.s) == 1 } +// ColumnTableName returns the table that is the origin of a particular result +// column in a SELECT statement. +// +// See https://www.sqlite.org/c3ref/column_database_name.html +func (s *SQLiteStmt) ColumnTableName(n int) string { + return C.GoString(C.sqlite3_column_table_name(s.s, C.int(n))) +} + // Close the rows. func (rc *SQLiteRows) Close() error { rc.s.mu.Lock() diff --git a/sqlite3_test.go b/sqlite3_test.go index 878ec49..e74c35e 100644 --- a/sqlite3_test.go +++ b/sqlite3_test.go @@ -1604,6 +1604,40 @@ func TestDeclTypes(t *testing.T) { } } +func TestColumnTableName(t *testing.T) { + d := SQLiteDriver{} + conn, err := d.Open(":memory:") + if err != nil { + t.Fatal("failed to get database connection:", err) + } + defer conn.Close() + sqlite3conn := conn.(*SQLiteConn) + + _, err = sqlite3conn.Exec(`CREATE TABLE foo (name string)`, nil) + if err != nil { + t.Fatal("Failed to create table:", err) + } + _, err = sqlite3conn.Exec(`CREATE TABLE bar (name string)`, nil) + if err != nil { + t.Fatal("Failed to create table:", err) + } + + stmt, err := sqlite3conn.Prepare(`SELECT * FROM foo JOIN bar ON foo.name = bar.name`) + if err != nil { + t.Fatal(err) + } + + if exp, got := "foo", stmt.(*SQLiteStmt).ColumnTableName(0); exp != got { + t.Fatalf("Incorrect table name returned expected: %s, got: %s", exp, got) + } + if exp, got := "bar", stmt.(*SQLiteStmt).ColumnTableName(1); exp != got { + t.Fatalf("Incorrect table name returned expected: %s, got: %s", exp, got) + } + if exp, got := "", stmt.(*SQLiteStmt).ColumnTableName(2); exp != got { + t.Fatalf("Incorrect table name returned expected: %s, got: %s", exp, got) + } +} + func TestPinger(t *testing.T) { db, err := sql.Open("sqlite3", ":memory:") if err != nil { |