conn_test.go 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659
  1. package pq
  2. import (
  3. "context"
  4. "database/sql"
  5. "database/sql/driver"
  6. "fmt"
  7. "io"
  8. "net"
  9. "os"
  10. "reflect"
  11. "strings"
  12. "testing"
  13. "time"
  14. )
  15. type Fatalistic interface {
  16. Fatal(args ...interface{})
  17. }
  18. func forceBinaryParameters() bool {
  19. bp := os.Getenv("PQTEST_BINARY_PARAMETERS")
  20. if bp == "yes" {
  21. return true
  22. } else if bp == "" || bp == "no" {
  23. return false
  24. } else {
  25. panic("unexpected value for PQTEST_BINARY_PARAMETERS")
  26. }
  27. }
  28. func testConninfo(conninfo string) string {
  29. defaultTo := func(envvar string, value string) {
  30. if os.Getenv(envvar) == "" {
  31. os.Setenv(envvar, value)
  32. }
  33. }
  34. defaultTo("PGDATABASE", "pqgotest")
  35. defaultTo("PGSSLMODE", "disable")
  36. defaultTo("PGCONNECT_TIMEOUT", "20")
  37. if forceBinaryParameters() &&
  38. !strings.HasPrefix(conninfo, "postgres://") &&
  39. !strings.HasPrefix(conninfo, "postgresql://") {
  40. conninfo = conninfo + " binary_parameters=yes"
  41. }
  42. return conninfo
  43. }
  44. func openTestConnConninfo(conninfo string) (*sql.DB, error) {
  45. return sql.Open("postgres", testConninfo(conninfo))
  46. }
  47. func openTestConn(t Fatalistic) *sql.DB {
  48. conn, err := openTestConnConninfo("")
  49. if err != nil {
  50. t.Fatal(err)
  51. }
  52. return conn
  53. }
  54. func getServerVersion(t *testing.T, db *sql.DB) int {
  55. var version int
  56. err := db.QueryRow("SHOW server_version_num").Scan(&version)
  57. if err != nil {
  58. t.Fatal(err)
  59. }
  60. return version
  61. }
  62. func TestReconnect(t *testing.T) {
  63. db1 := openTestConn(t)
  64. defer db1.Close()
  65. tx, err := db1.Begin()
  66. if err != nil {
  67. t.Fatal(err)
  68. }
  69. var pid1 int
  70. err = tx.QueryRow("SELECT pg_backend_pid()").Scan(&pid1)
  71. if err != nil {
  72. t.Fatal(err)
  73. }
  74. db2 := openTestConn(t)
  75. defer db2.Close()
  76. _, err = db2.Exec("SELECT pg_terminate_backend($1)", pid1)
  77. if err != nil {
  78. t.Fatal(err)
  79. }
  80. // The rollback will probably "fail" because we just killed
  81. // its connection above
  82. _ = tx.Rollback()
  83. const expected int = 42
  84. var result int
  85. err = db1.QueryRow(fmt.Sprintf("SELECT %d", expected)).Scan(&result)
  86. if err != nil {
  87. t.Fatal(err)
  88. }
  89. if result != expected {
  90. t.Errorf("got %v; expected %v", result, expected)
  91. }
  92. }
  93. func TestCommitInFailedTransaction(t *testing.T) {
  94. db := openTestConn(t)
  95. defer db.Close()
  96. txn, err := db.Begin()
  97. if err != nil {
  98. t.Fatal(err)
  99. }
  100. rows, err := txn.Query("SELECT error")
  101. if err == nil {
  102. rows.Close()
  103. t.Fatal("expected failure")
  104. }
  105. err = txn.Commit()
  106. if err != ErrInFailedTransaction {
  107. t.Fatalf("expected ErrInFailedTransaction; got %#v", err)
  108. }
  109. }
  110. func TestOpenURL(t *testing.T) {
  111. testURL := func(url string) {
  112. db, err := openTestConnConninfo(url)
  113. if err != nil {
  114. t.Fatal(err)
  115. }
  116. defer db.Close()
  117. // database/sql might not call our Open at all unless we do something with
  118. // the connection
  119. txn, err := db.Begin()
  120. if err != nil {
  121. t.Fatal(err)
  122. }
  123. txn.Rollback()
  124. }
  125. testURL("postgres://")
  126. testURL("postgresql://")
  127. }
  128. const pgpassFile = "/tmp/pqgotest_pgpass"
  129. func TestPgpass(t *testing.T) {
  130. if os.Getenv("TRAVIS") != "true" {
  131. t.Skip("not running under Travis, skipping pgpass tests")
  132. }
  133. testAssert := func(conninfo string, expected string, reason string) {
  134. conn, err := openTestConnConninfo(conninfo)
  135. if err != nil {
  136. t.Fatal(err)
  137. }
  138. defer conn.Close()
  139. txn, err := conn.Begin()
  140. if err != nil {
  141. if expected != "fail" {
  142. t.Fatalf(reason, err)
  143. }
  144. return
  145. }
  146. rows, err := txn.Query("SELECT USER")
  147. if err != nil {
  148. txn.Rollback()
  149. if expected != "fail" {
  150. t.Fatalf(reason, err)
  151. }
  152. } else {
  153. rows.Close()
  154. if expected != "ok" {
  155. t.Fatalf(reason, err)
  156. }
  157. }
  158. txn.Rollback()
  159. }
  160. testAssert("", "ok", "missing .pgpass, unexpected error %#v")
  161. os.Setenv("PGPASSFILE", pgpassFile)
  162. testAssert("host=/tmp", "fail", ", unexpected error %#v")
  163. os.Remove(pgpassFile)
  164. pgpass, err := os.OpenFile(pgpassFile, os.O_RDWR|os.O_CREATE, 0644)
  165. if err != nil {
  166. t.Fatalf("Unexpected error writing pgpass file %#v", err)
  167. }
  168. _, err = pgpass.WriteString(`# comment
  169. server:5432:some_db:some_user:pass_A
  170. *:5432:some_db:some_user:pass_B
  171. localhost:*:*:*:pass_C
  172. *:*:*:*:pass_fallback
  173. `)
  174. if err != nil {
  175. t.Fatalf("Unexpected error writing pgpass file %#v", err)
  176. }
  177. pgpass.Close()
  178. assertPassword := func(extra values, expected string) {
  179. o := values{
  180. "host": "localhost",
  181. "sslmode": "disable",
  182. "connect_timeout": "20",
  183. "user": "majid",
  184. "port": "5432",
  185. "extra_float_digits": "2",
  186. "dbname": "pqgotest",
  187. "client_encoding": "UTF8",
  188. "datestyle": "ISO, MDY",
  189. }
  190. for k, v := range extra {
  191. o[k] = v
  192. }
  193. (&conn{}).handlePgpass(o)
  194. if pw := o["password"]; pw != expected {
  195. t.Fatalf("For %v expected %s got %s", extra, expected, pw)
  196. }
  197. }
  198. // wrong permissions for the pgpass file means it should be ignored
  199. assertPassword(values{"host": "example.com", "user": "foo"}, "")
  200. // fix the permissions and check if it has taken effect
  201. os.Chmod(pgpassFile, 0600)
  202. assertPassword(values{"host": "server", "dbname": "some_db", "user": "some_user"}, "pass_A")
  203. assertPassword(values{"host": "example.com", "user": "foo"}, "pass_fallback")
  204. assertPassword(values{"host": "example.com", "dbname": "some_db", "user": "some_user"}, "pass_B")
  205. // localhost also matches the default "" and UNIX sockets
  206. assertPassword(values{"host": "", "user": "some_user"}, "pass_C")
  207. assertPassword(values{"host": "/tmp", "user": "some_user"}, "pass_C")
  208. // cleanup
  209. os.Remove(pgpassFile)
  210. os.Setenv("PGPASSFILE", "")
  211. }
  212. func TestExec(t *testing.T) {
  213. db := openTestConn(t)
  214. defer db.Close()
  215. _, err := db.Exec("CREATE TEMP TABLE temp (a int)")
  216. if err != nil {
  217. t.Fatal(err)
  218. }
  219. r, err := db.Exec("INSERT INTO temp VALUES (1)")
  220. if err != nil {
  221. t.Fatal(err)
  222. }
  223. if n, _ := r.RowsAffected(); n != 1 {
  224. t.Fatalf("expected 1 row affected, not %d", n)
  225. }
  226. r, err = db.Exec("INSERT INTO temp VALUES ($1), ($2), ($3)", 1, 2, 3)
  227. if err != nil {
  228. t.Fatal(err)
  229. }
  230. if n, _ := r.RowsAffected(); n != 3 {
  231. t.Fatalf("expected 3 rows affected, not %d", n)
  232. }
  233. // SELECT doesn't send the number of returned rows in the command tag
  234. // before 9.0
  235. if getServerVersion(t, db) >= 90000 {
  236. r, err = db.Exec("SELECT g FROM generate_series(1, 2) g")
  237. if err != nil {
  238. t.Fatal(err)
  239. }
  240. if n, _ := r.RowsAffected(); n != 2 {
  241. t.Fatalf("expected 2 rows affected, not %d", n)
  242. }
  243. r, err = db.Exec("SELECT g FROM generate_series(1, $1) g", 3)
  244. if err != nil {
  245. t.Fatal(err)
  246. }
  247. if n, _ := r.RowsAffected(); n != 3 {
  248. t.Fatalf("expected 3 rows affected, not %d", n)
  249. }
  250. }
  251. }
  252. func TestStatment(t *testing.T) {
  253. db := openTestConn(t)
  254. defer db.Close()
  255. st, err := db.Prepare("SELECT 1")
  256. if err != nil {
  257. t.Fatal(err)
  258. }
  259. st1, err := db.Prepare("SELECT 2")
  260. if err != nil {
  261. t.Fatal(err)
  262. }
  263. r, err := st.Query()
  264. if err != nil {
  265. t.Fatal(err)
  266. }
  267. defer r.Close()
  268. if !r.Next() {
  269. t.Fatal("expected row")
  270. }
  271. var i int
  272. err = r.Scan(&i)
  273. if err != nil {
  274. t.Fatal(err)
  275. }
  276. if i != 1 {
  277. t.Fatalf("expected 1, got %d", i)
  278. }
  279. // st1
  280. r1, err := st1.Query()
  281. if err != nil {
  282. t.Fatal(err)
  283. }
  284. defer r1.Close()
  285. if !r1.Next() {
  286. if r.Err() != nil {
  287. t.Fatal(r1.Err())
  288. }
  289. t.Fatal("expected row")
  290. }
  291. err = r1.Scan(&i)
  292. if err != nil {
  293. t.Fatal(err)
  294. }
  295. if i != 2 {
  296. t.Fatalf("expected 2, got %d", i)
  297. }
  298. }
  299. func TestRowsCloseBeforeDone(t *testing.T) {
  300. db := openTestConn(t)
  301. defer db.Close()
  302. r, err := db.Query("SELECT 1")
  303. if err != nil {
  304. t.Fatal(err)
  305. }
  306. err = r.Close()
  307. if err != nil {
  308. t.Fatal(err)
  309. }
  310. if r.Next() {
  311. t.Fatal("unexpected row")
  312. }
  313. if r.Err() != nil {
  314. t.Fatal(r.Err())
  315. }
  316. }
  317. func TestParameterCountMismatch(t *testing.T) {
  318. db := openTestConn(t)
  319. defer db.Close()
  320. var notused int
  321. err := db.QueryRow("SELECT false", 1).Scan(&notused)
  322. if err == nil {
  323. t.Fatal("expected err")
  324. }
  325. // make sure we clean up correctly
  326. err = db.QueryRow("SELECT 1").Scan(&notused)
  327. if err != nil {
  328. t.Fatal(err)
  329. }
  330. err = db.QueryRow("SELECT $1").Scan(&notused)
  331. if err == nil {
  332. t.Fatal("expected err")
  333. }
  334. // make sure we clean up correctly
  335. err = db.QueryRow("SELECT 1").Scan(&notused)
  336. if err != nil {
  337. t.Fatal(err)
  338. }
  339. }
  340. // Test that EmptyQueryResponses are handled correctly.
  341. func TestEmptyQuery(t *testing.T) {
  342. db := openTestConn(t)
  343. defer db.Close()
  344. res, err := db.Exec("")
  345. if err != nil {
  346. t.Fatal(err)
  347. }
  348. if _, err := res.RowsAffected(); err != errNoRowsAffected {
  349. t.Fatalf("expected %s, got %v", errNoRowsAffected, err)
  350. }
  351. if _, err := res.LastInsertId(); err != errNoLastInsertID {
  352. t.Fatalf("expected %s, got %v", errNoLastInsertID, err)
  353. }
  354. rows, err := db.Query("")
  355. if err != nil {
  356. t.Fatal(err)
  357. }
  358. cols, err := rows.Columns()
  359. if err != nil {
  360. t.Fatal(err)
  361. }
  362. if len(cols) != 0 {
  363. t.Fatalf("unexpected number of columns %d in response to an empty query", len(cols))
  364. }
  365. if rows.Next() {
  366. t.Fatal("unexpected row")
  367. }
  368. if rows.Err() != nil {
  369. t.Fatal(rows.Err())
  370. }
  371. stmt, err := db.Prepare("")
  372. if err != nil {
  373. t.Fatal(err)
  374. }
  375. res, err = stmt.Exec()
  376. if err != nil {
  377. t.Fatal(err)
  378. }
  379. if _, err := res.RowsAffected(); err != errNoRowsAffected {
  380. t.Fatalf("expected %s, got %v", errNoRowsAffected, err)
  381. }
  382. if _, err := res.LastInsertId(); err != errNoLastInsertID {
  383. t.Fatalf("expected %s, got %v", errNoLastInsertID, err)
  384. }
  385. rows, err = stmt.Query()
  386. if err != nil {
  387. t.Fatal(err)
  388. }
  389. cols, err = rows.Columns()
  390. if err != nil {
  391. t.Fatal(err)
  392. }
  393. if len(cols) != 0 {
  394. t.Fatalf("unexpected number of columns %d in response to an empty query", len(cols))
  395. }
  396. if rows.Next() {
  397. t.Fatal("unexpected row")
  398. }
  399. if rows.Err() != nil {
  400. t.Fatal(rows.Err())
  401. }
  402. }
  403. // Test that rows.Columns() is correct even if there are no result rows.
  404. func TestEmptyResultSetColumns(t *testing.T) {
  405. db := openTestConn(t)
  406. defer db.Close()
  407. rows, err := db.Query("SELECT 1 AS a, text 'bar' AS bar WHERE FALSE")
  408. if err != nil {
  409. t.Fatal(err)
  410. }
  411. cols, err := rows.Columns()
  412. if err != nil {
  413. t.Fatal(err)
  414. }
  415. if len(cols) != 2 {
  416. t.Fatalf("unexpected number of columns %d in response to an empty query", len(cols))
  417. }
  418. if rows.Next() {
  419. t.Fatal("unexpected row")
  420. }
  421. if rows.Err() != nil {
  422. t.Fatal(rows.Err())
  423. }
  424. if cols[0] != "a" || cols[1] != "bar" {
  425. t.Fatalf("unexpected Columns result %v", cols)
  426. }
  427. stmt, err := db.Prepare("SELECT $1::int AS a, text 'bar' AS bar WHERE FALSE")
  428. if err != nil {
  429. t.Fatal(err)
  430. }
  431. rows, err = stmt.Query(1)
  432. if err != nil {
  433. t.Fatal(err)
  434. }
  435. cols, err = rows.Columns()
  436. if err != nil {
  437. t.Fatal(err)
  438. }
  439. if len(cols) != 2 {
  440. t.Fatalf("unexpected number of columns %d in response to an empty query", len(cols))
  441. }
  442. if rows.Next() {
  443. t.Fatal("unexpected row")
  444. }
  445. if rows.Err() != nil {
  446. t.Fatal(rows.Err())
  447. }
  448. if cols[0] != "a" || cols[1] != "bar" {
  449. t.Fatalf("unexpected Columns result %v", cols)
  450. }
  451. }
  452. func TestEncodeDecode(t *testing.T) {
  453. db := openTestConn(t)
  454. defer db.Close()
  455. q := `
  456. SELECT
  457. E'\\000\\001\\002'::bytea,
  458. 'foobar'::text,
  459. NULL::integer,
  460. '2000-1-1 01:02:03.04-7'::timestamptz,
  461. 0::boolean,
  462. 123,
  463. -321,
  464. 3.14::float8
  465. WHERE
  466. E'\\000\\001\\002'::bytea = $1
  467. AND 'foobar'::text = $2
  468. AND $3::integer is NULL
  469. `
  470. // AND '2000-1-1 12:00:00.000000-7'::timestamp = $3
  471. exp1 := []byte{0, 1, 2}
  472. exp2 := "foobar"
  473. r, err := db.Query(q, exp1, exp2, nil)
  474. if err != nil {
  475. t.Fatal(err)
  476. }
  477. defer r.Close()
  478. if !r.Next() {
  479. if r.Err() != nil {
  480. t.Fatal(r.Err())
  481. }
  482. t.Fatal("expected row")
  483. }
  484. var got1 []byte
  485. var got2 string
  486. var got3 = sql.NullInt64{Valid: true}
  487. var got4 time.Time
  488. var got5, got6, got7, got8 interface{}
  489. err = r.Scan(&got1, &got2, &got3, &got4, &got5, &got6, &got7, &got8)
  490. if err != nil {
  491. t.Fatal(err)
  492. }
  493. if !reflect.DeepEqual(exp1, got1) {
  494. t.Errorf("expected %q byte: %q", exp1, got1)
  495. }
  496. if !reflect.DeepEqual(exp2, got2) {
  497. t.Errorf("expected %q byte: %q", exp2, got2)
  498. }
  499. if got3.Valid {
  500. t.Fatal("expected invalid")
  501. }
  502. if got4.Year() != 2000 {
  503. t.Fatal("wrong year")
  504. }
  505. if got5 != false {
  506. t.Fatalf("expected false, got %q", got5)
  507. }
  508. if got6 != int64(123) {
  509. t.Fatalf("expected 123, got %d", got6)
  510. }
  511. if got7 != int64(-321) {
  512. t.Fatalf("expected -321, got %d", got7)
  513. }
  514. if got8 != float64(3.14) {
  515. t.Fatalf("expected 3.14, got %f", got8)
  516. }
  517. }
  518. func TestNoData(t *testing.T) {
  519. db := openTestConn(t)
  520. defer db.Close()
  521. st, err := db.Prepare("SELECT 1 WHERE true = false")
  522. if err != nil {
  523. t.Fatal(err)
  524. }
  525. defer st.Close()
  526. r, err := st.Query()
  527. if err != nil {
  528. t.Fatal(err)
  529. }
  530. defer r.Close()
  531. if r.Next() {
  532. if r.Err() != nil {
  533. t.Fatal(r.Err())
  534. }
  535. t.Fatal("unexpected row")
  536. }
  537. _, err = db.Query("SELECT * FROM nonexistenttable WHERE age=$1", 20)
  538. if err == nil {
  539. t.Fatal("Should have raised an error on non existent table")
  540. }
  541. _, err = db.Query("SELECT * FROM nonexistenttable")
  542. if err == nil {
  543. t.Fatal("Should have raised an error on non existent table")
  544. }
  545. }
  546. func TestErrorDuringStartup(t *testing.T) {
  547. // Don't use the normal connection setup, this is intended to
  548. // blow up in the startup packet from a non-existent user.
  549. db, err := openTestConnConninfo("user=thisuserreallydoesntexist")
  550. if err != nil {
  551. t.Fatal(err)
  552. }
  553. defer db.Close()
  554. _, err = db.Begin()
  555. if err == nil {
  556. t.Fatal("expected error")
  557. }
  558. e, ok := err.(*Error)
  559. if !ok {
  560. t.Fatalf("expected Error, got %#v", err)
  561. } else if e.Code.Name() != "invalid_authorization_specification" && e.Code.Name() != "invalid_password" {
  562. t.Fatalf("expected invalid_authorization_specification or invalid_password, got %s (%+v)", e.Code.Name(), err)
  563. }
  564. }
  565. type testConn struct {
  566. closed bool
  567. net.Conn
  568. }
  569. func (c *testConn) Close() error {
  570. c.closed = true
  571. return c.Conn.Close()
  572. }
  573. type testDialer struct {
  574. conns []*testConn
  575. }
  576. func (d *testDialer) Dial(ntw, addr string) (net.Conn, error) {
  577. c, err := net.Dial(ntw, addr)
  578. if err != nil {
  579. return nil, err
  580. }
  581. tc := &testConn{Conn: c}
  582. d.conns = append(d.conns, tc)
  583. return tc, nil
  584. }
  585. func (d *testDialer) DialTimeout(ntw, addr string, timeout time.Duration) (net.Conn, error) {
  586. c, err := net.DialTimeout(ntw, addr, timeout)
  587. if err != nil {
  588. return nil, err
  589. }
  590. tc := &testConn{Conn: c}
  591. d.conns = append(d.conns, tc)
  592. return tc, nil
  593. }
  594. func TestErrorDuringStartupClosesConn(t *testing.T) {
  595. // Don't use the normal connection setup, this is intended to
  596. // blow up in the startup packet from a non-existent user.
  597. var d testDialer
  598. c, err := DialOpen(&d, testConninfo("user=thisuserreallydoesntexist"))
  599. if err == nil {
  600. c.Close()
  601. t.Fatal("expected dial error")
  602. }
  603. if len(d.conns) != 1 {
  604. t.Fatalf("got len(d.conns) = %d, want = %d", len(d.conns), 1)
  605. }
  606. if !d.conns[0].closed {
  607. t.Error("connection leaked")
  608. }
  609. }
  610. func TestBadConn(t *testing.T) {
  611. var err error
  612. cn := conn{}
  613. func() {
  614. defer cn.errRecover(&err)
  615. panic(io.EOF)
  616. }()
  617. if err != driver.ErrBadConn {
  618. t.Fatalf("expected driver.ErrBadConn, got: %#v", err)
  619. }
  620. if !cn.bad {
  621. t.Fatalf("expected cn.bad")
  622. }
  623. cn = conn{}
  624. func() {
  625. defer cn.errRecover(&err)
  626. e := &Error{Severity: Efatal}
  627. panic(e)
  628. }()
  629. if err != driver.ErrBadConn {
  630. t.Fatalf("expected driver.ErrBadConn, got: %#v", err)
  631. }
  632. if !cn.bad {
  633. t.Fatalf("expected cn.bad")
  634. }
  635. }
  636. // TestCloseBadConn tests that the underlying connection can be closed with
  637. // Close after an error.
  638. func TestCloseBadConn(t *testing.T) {
  639. nc, err := net.Dial("tcp", "localhost:5432")
  640. if err != nil {
  641. t.Fatal(err)
  642. }
  643. cn := conn{c: nc}
  644. func() {
  645. defer cn.errRecover(&err)
  646. panic(io.EOF)
  647. }()
  648. // Verify we can write before closing.
  649. if _, err := nc.Write(nil); err != nil {
  650. t.Fatal(err)
  651. }
  652. // First close should close the connection.
  653. if err := cn.Close(); err != nil {
  654. t.Fatal(err)
  655. }
  656. // During the Go 1.9 cycle, https://github.com/golang/go/commit/3792db5
  657. // changed this error from
  658. //
  659. // net.errClosing = errors.New("use of closed network connection")
  660. //
  661. // to
  662. //
  663. // internal/poll.ErrClosing = errors.New("use of closed file or network connection")
  664. const errClosing = "use of closed"
  665. // Verify write after closing fails.
  666. if _, err := nc.Write(nil); err == nil {
  667. t.Fatal("expected error")
  668. } else if !strings.Contains(err.Error(), errClosing) {
  669. t.Fatalf("expected %s error, got %s", errClosing, err)
  670. }
  671. // Verify second close fails.
  672. if err := cn.Close(); err == nil {
  673. t.Fatal("expected error")
  674. } else if !strings.Contains(err.Error(), errClosing) {
  675. t.Fatalf("expected %s error, got %s", errClosing, err)
  676. }
  677. }
  678. func TestErrorOnExec(t *testing.T) {
  679. db := openTestConn(t)
  680. defer db.Close()
  681. txn, err := db.Begin()
  682. if err != nil {
  683. t.Fatal(err)
  684. }
  685. defer txn.Rollback()
  686. _, err = txn.Exec("CREATE TEMPORARY TABLE foo(f1 int PRIMARY KEY)")
  687. if err != nil {
  688. t.Fatal(err)
  689. }
  690. _, err = txn.Exec("INSERT INTO foo VALUES (0), (0)")
  691. if err == nil {
  692. t.Fatal("Should have raised error")
  693. }
  694. e, ok := err.(*Error)
  695. if !ok {
  696. t.Fatalf("expected Error, got %#v", err)
  697. } else if e.Code.Name() != "unique_violation" {
  698. t.Fatalf("expected unique_violation, got %s (%+v)", e.Code.Name(), err)
  699. }
  700. }
  701. func TestErrorOnQuery(t *testing.T) {
  702. db := openTestConn(t)
  703. defer db.Close()
  704. txn, err := db.Begin()
  705. if err != nil {
  706. t.Fatal(err)
  707. }
  708. defer txn.Rollback()
  709. _, err = txn.Exec("CREATE TEMPORARY TABLE foo(f1 int PRIMARY KEY)")
  710. if err != nil {
  711. t.Fatal(err)
  712. }
  713. _, err = txn.Query("INSERT INTO foo VALUES (0), (0)")
  714. if err == nil {
  715. t.Fatal("Should have raised error")
  716. }
  717. e, ok := err.(*Error)
  718. if !ok {
  719. t.Fatalf("expected Error, got %#v", err)
  720. } else if e.Code.Name() != "unique_violation" {
  721. t.Fatalf("expected unique_violation, got %s (%+v)", e.Code.Name(), err)
  722. }
  723. }
  724. func TestErrorOnQueryRowSimpleQuery(t *testing.T) {
  725. db := openTestConn(t)
  726. defer db.Close()
  727. txn, err := db.Begin()
  728. if err != nil {
  729. t.Fatal(err)
  730. }
  731. defer txn.Rollback()
  732. _, err = txn.Exec("CREATE TEMPORARY TABLE foo(f1 int PRIMARY KEY)")
  733. if err != nil {
  734. t.Fatal(err)
  735. }
  736. var v int
  737. err = txn.QueryRow("INSERT INTO foo VALUES (0), (0)").Scan(&v)
  738. if err == nil {
  739. t.Fatal("Should have raised error")
  740. }
  741. e, ok := err.(*Error)
  742. if !ok {
  743. t.Fatalf("expected Error, got %#v", err)
  744. } else if e.Code.Name() != "unique_violation" {
  745. t.Fatalf("expected unique_violation, got %s (%+v)", e.Code.Name(), err)
  746. }
  747. }
  748. // Test the QueryRow bug workarounds in stmt.exec() and simpleQuery()
  749. func TestQueryRowBugWorkaround(t *testing.T) {
  750. db := openTestConn(t)
  751. defer db.Close()
  752. // stmt.exec()
  753. _, err := db.Exec("CREATE TEMP TABLE notnulltemp (a varchar(10) not null)")
  754. if err != nil {
  755. t.Fatal(err)
  756. }
  757. var a string
  758. err = db.QueryRow("INSERT INTO notnulltemp(a) values($1) RETURNING a", nil).Scan(&a)
  759. if err == sql.ErrNoRows {
  760. t.Fatalf("expected constraint violation error; got: %v", err)
  761. }
  762. pge, ok := err.(*Error)
  763. if !ok {
  764. t.Fatalf("expected *Error; got: %#v", err)
  765. }
  766. if pge.Code.Name() != "not_null_violation" {
  767. t.Fatalf("expected not_null_violation; got: %s (%+v)", pge.Code.Name(), err)
  768. }
  769. // Test workaround in simpleQuery()
  770. tx, err := db.Begin()
  771. if err != nil {
  772. t.Fatalf("unexpected error %s in Begin", err)
  773. }
  774. defer tx.Rollback()
  775. _, err = tx.Exec("SET LOCAL check_function_bodies TO FALSE")
  776. if err != nil {
  777. t.Fatalf("could not disable check_function_bodies: %s", err)
  778. }
  779. _, err = tx.Exec(`
  780. CREATE OR REPLACE FUNCTION bad_function()
  781. RETURNS integer
  782. -- hack to prevent the function from being inlined
  783. SET check_function_bodies TO TRUE
  784. AS $$
  785. SELECT text 'bad'
  786. $$ LANGUAGE sql`)
  787. if err != nil {
  788. t.Fatalf("could not create function: %s", err)
  789. }
  790. err = tx.QueryRow("SELECT * FROM bad_function()").Scan(&a)
  791. if err == nil {
  792. t.Fatalf("expected error")
  793. }
  794. pge, ok = err.(*Error)
  795. if !ok {
  796. t.Fatalf("expected *Error; got: %#v", err)
  797. }
  798. if pge.Code.Name() != "invalid_function_definition" {
  799. t.Fatalf("expected invalid_function_definition; got: %s (%+v)", pge.Code.Name(), err)
  800. }
  801. err = tx.Rollback()
  802. if err != nil {
  803. t.Fatalf("unexpected error %s in Rollback", err)
  804. }
  805. // Also test that simpleQuery()'s workaround works when the query fails
  806. // after a row has been received.
  807. rows, err := db.Query(`
  808. select
  809. (select generate_series(1, ss.i))
  810. from (select gs.i
  811. from generate_series(1, 2) gs(i)
  812. order by gs.i limit 2) ss`)
  813. if err != nil {
  814. t.Fatalf("query failed: %s", err)
  815. }
  816. if !rows.Next() {
  817. t.Fatalf("expected at least one result row; got %s", rows.Err())
  818. }
  819. var i int
  820. err = rows.Scan(&i)
  821. if err != nil {
  822. t.Fatalf("rows.Scan() failed: %s", err)
  823. }
  824. if i != 1 {
  825. t.Fatalf("unexpected value for i: %d", i)
  826. }
  827. if rows.Next() {
  828. t.Fatalf("unexpected row")
  829. }
  830. pge, ok = rows.Err().(*Error)
  831. if !ok {
  832. t.Fatalf("expected *Error; got: %#v", err)
  833. }
  834. if pge.Code.Name() != "cardinality_violation" {
  835. t.Fatalf("expected cardinality_violation; got: %s (%+v)", pge.Code.Name(), rows.Err())
  836. }
  837. }
  838. func TestSimpleQuery(t *testing.T) {
  839. db := openTestConn(t)
  840. defer db.Close()
  841. r, err := db.Query("select 1")
  842. if err != nil {
  843. t.Fatal(err)
  844. }
  845. defer r.Close()
  846. if !r.Next() {
  847. t.Fatal("expected row")
  848. }
  849. }
  850. func TestBindError(t *testing.T) {
  851. db := openTestConn(t)
  852. defer db.Close()
  853. _, err := db.Exec("create temp table test (i integer)")
  854. if err != nil {
  855. t.Fatal(err)
  856. }
  857. _, err = db.Query("select * from test where i=$1", "hhh")
  858. if err == nil {
  859. t.Fatal("expected an error")
  860. }
  861. // Should not get error here
  862. r, err := db.Query("select * from test where i=$1", 1)
  863. if err != nil {
  864. t.Fatal(err)
  865. }
  866. defer r.Close()
  867. }
  868. func TestParseErrorInExtendedQuery(t *testing.T) {
  869. db := openTestConn(t)
  870. defer db.Close()
  871. _, err := db.Query("PARSE_ERROR $1", 1)
  872. pqErr, _ := err.(*Error)
  873. // Expecting a syntax error.
  874. if err == nil || pqErr == nil || pqErr.Code != "42601" {
  875. t.Fatalf("expected syntax error, got %s", err)
  876. }
  877. rows, err := db.Query("SELECT 1")
  878. if err != nil {
  879. t.Fatal(err)
  880. }
  881. rows.Close()
  882. }
  883. // TestReturning tests that an INSERT query using the RETURNING clause returns a row.
  884. func TestReturning(t *testing.T) {
  885. db := openTestConn(t)
  886. defer db.Close()
  887. _, err := db.Exec("CREATE TEMP TABLE distributors (did integer default 0, dname text)")
  888. if err != nil {
  889. t.Fatal(err)
  890. }
  891. rows, err := db.Query("INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets') " +
  892. "RETURNING did;")
  893. if err != nil {
  894. t.Fatal(err)
  895. }
  896. if !rows.Next() {
  897. t.Fatal("no rows")
  898. }
  899. var did int
  900. err = rows.Scan(&did)
  901. if err != nil {
  902. t.Fatal(err)
  903. }
  904. if did != 0 {
  905. t.Fatalf("bad value for did: got %d, want %d", did, 0)
  906. }
  907. if rows.Next() {
  908. t.Fatal("unexpected next row")
  909. }
  910. err = rows.Err()
  911. if err != nil {
  912. t.Fatal(err)
  913. }
  914. }
  915. func TestIssue186(t *testing.T) {
  916. db := openTestConn(t)
  917. defer db.Close()
  918. // Exec() a query which returns results
  919. _, err := db.Exec("VALUES (1), (2), (3)")
  920. if err != nil {
  921. t.Fatal(err)
  922. }
  923. _, err = db.Exec("VALUES ($1), ($2), ($3)", 1, 2, 3)
  924. if err != nil {
  925. t.Fatal(err)
  926. }
  927. // Query() a query which doesn't return any results
  928. txn, err := db.Begin()
  929. if err != nil {
  930. t.Fatal(err)
  931. }
  932. defer txn.Rollback()
  933. rows, err := txn.Query("CREATE TEMP TABLE foo(f1 int)")
  934. if err != nil {
  935. t.Fatal(err)
  936. }
  937. if err = rows.Close(); err != nil {
  938. t.Fatal(err)
  939. }
  940. // small trick to get NoData from a parameterized query
  941. _, err = txn.Exec("CREATE RULE nodata AS ON INSERT TO foo DO INSTEAD NOTHING")
  942. if err != nil {
  943. t.Fatal(err)
  944. }
  945. rows, err = txn.Query("INSERT INTO foo VALUES ($1)", 1)
  946. if err != nil {
  947. t.Fatal(err)
  948. }
  949. if err = rows.Close(); err != nil {
  950. t.Fatal(err)
  951. }
  952. }
  953. func TestIssue196(t *testing.T) {
  954. db := openTestConn(t)
  955. defer db.Close()
  956. row := db.QueryRow("SELECT float4 '0.10000122' = $1, float8 '35.03554004971999' = $2",
  957. float32(0.10000122), float64(35.03554004971999))
  958. var float4match, float8match bool
  959. err := row.Scan(&float4match, &float8match)
  960. if err != nil {
  961. t.Fatal(err)
  962. }
  963. if !float4match {
  964. t.Errorf("Expected float4 fidelity to be maintained; got no match")
  965. }
  966. if !float8match {
  967. t.Errorf("Expected float8 fidelity to be maintained; got no match")
  968. }
  969. }
  970. // Test that any CommandComplete messages sent before the query results are
  971. // ignored.
  972. func TestIssue282(t *testing.T) {
  973. db := openTestConn(t)
  974. defer db.Close()
  975. var searchPath string
  976. err := db.QueryRow(`
  977. SET LOCAL search_path TO pg_catalog;
  978. SET LOCAL search_path TO pg_catalog;
  979. SHOW search_path`).Scan(&searchPath)
  980. if err != nil {
  981. t.Fatal(err)
  982. }
  983. if searchPath != "pg_catalog" {
  984. t.Fatalf("unexpected search_path %s", searchPath)
  985. }
  986. }
  987. func TestReadFloatPrecision(t *testing.T) {
  988. db := openTestConn(t)
  989. defer db.Close()
  990. row := db.QueryRow("SELECT float4 '0.10000122', float8 '35.03554004971999'")
  991. var float4val float32
  992. var float8val float64
  993. err := row.Scan(&float4val, &float8val)
  994. if err != nil {
  995. t.Fatal(err)
  996. }
  997. if float4val != float32(0.10000122) {
  998. t.Errorf("Expected float4 fidelity to be maintained; got no match")
  999. }
  1000. if float8val != float64(35.03554004971999) {
  1001. t.Errorf("Expected float8 fidelity to be maintained; got no match")
  1002. }
  1003. }
  1004. func TestXactMultiStmt(t *testing.T) {
  1005. // minified test case based on bug reports from
  1006. // pico303@gmail.com and rangelspam@gmail.com
  1007. t.Skip("Skipping failing test")
  1008. db := openTestConn(t)
  1009. defer db.Close()
  1010. tx, err := db.Begin()
  1011. if err != nil {
  1012. t.Fatal(err)
  1013. }
  1014. defer tx.Commit()
  1015. rows, err := tx.Query("select 1")
  1016. if err != nil {
  1017. t.Fatal(err)
  1018. }
  1019. if rows.Next() {
  1020. var val int32
  1021. if err = rows.Scan(&val); err != nil {
  1022. t.Fatal(err)
  1023. }
  1024. } else {
  1025. t.Fatal("Expected at least one row in first query in xact")
  1026. }
  1027. rows2, err := tx.Query("select 2")
  1028. if err != nil {
  1029. t.Fatal(err)
  1030. }
  1031. if rows2.Next() {
  1032. var val2 int32
  1033. if err := rows2.Scan(&val2); err != nil {
  1034. t.Fatal(err)
  1035. }
  1036. } else {
  1037. t.Fatal("Expected at least one row in second query in xact")
  1038. }
  1039. if err = rows.Err(); err != nil {
  1040. t.Fatal(err)
  1041. }
  1042. if err = rows2.Err(); err != nil {
  1043. t.Fatal(err)
  1044. }
  1045. if err = tx.Commit(); err != nil {
  1046. t.Fatal(err)
  1047. }
  1048. }
  1049. var envParseTests = []struct {
  1050. Expected map[string]string
  1051. Env []string
  1052. }{
  1053. {
  1054. Env: []string{"PGDATABASE=hello", "PGUSER=goodbye"},
  1055. Expected: map[string]string{"dbname": "hello", "user": "goodbye"},
  1056. },
  1057. {
  1058. Env: []string{"PGDATESTYLE=ISO, MDY"},
  1059. Expected: map[string]string{"datestyle": "ISO, MDY"},
  1060. },
  1061. {
  1062. Env: []string{"PGCONNECT_TIMEOUT=30"},
  1063. Expected: map[string]string{"connect_timeout": "30"},
  1064. },
  1065. }
  1066. func TestParseEnviron(t *testing.T) {
  1067. for i, tt := range envParseTests {
  1068. results := parseEnviron(tt.Env)
  1069. if !reflect.DeepEqual(tt.Expected, results) {
  1070. t.Errorf("%d: Expected: %#v Got: %#v", i, tt.Expected, results)
  1071. }
  1072. }
  1073. }
  1074. func TestParseComplete(t *testing.T) {
  1075. tpc := func(commandTag string, command string, affectedRows int64, shouldFail bool) {
  1076. defer func() {
  1077. if p := recover(); p != nil {
  1078. if !shouldFail {
  1079. t.Error(p)
  1080. }
  1081. }
  1082. }()
  1083. cn := &conn{}
  1084. res, c := cn.parseComplete(commandTag)
  1085. if c != command {
  1086. t.Errorf("Expected %v, got %v", command, c)
  1087. }
  1088. n, err := res.RowsAffected()
  1089. if err != nil {
  1090. t.Fatal(err)
  1091. }
  1092. if n != affectedRows {
  1093. t.Errorf("Expected %d, got %d", affectedRows, n)
  1094. }
  1095. }
  1096. tpc("ALTER TABLE", "ALTER TABLE", 0, false)
  1097. tpc("INSERT 0 1", "INSERT", 1, false)
  1098. tpc("UPDATE 100", "UPDATE", 100, false)
  1099. tpc("SELECT 100", "SELECT", 100, false)
  1100. tpc("FETCH 100", "FETCH", 100, false)
  1101. // allow COPY (and others) without row count
  1102. tpc("COPY", "COPY", 0, false)
  1103. // don't fail on command tags we don't recognize
  1104. tpc("UNKNOWNCOMMANDTAG", "UNKNOWNCOMMANDTAG", 0, false)
  1105. // failure cases
  1106. tpc("INSERT 1", "", 0, true) // missing oid
  1107. tpc("UPDATE 0 1", "", 0, true) // too many numbers
  1108. tpc("SELECT foo", "", 0, true) // invalid row count
  1109. }
  1110. // Test interface conformance.
  1111. var (
  1112. _ driver.ExecerContext = (*conn)(nil)
  1113. _ driver.QueryerContext = (*conn)(nil)
  1114. )
  1115. func TestNullAfterNonNull(t *testing.T) {
  1116. db := openTestConn(t)
  1117. defer db.Close()
  1118. r, err := db.Query("SELECT 9::integer UNION SELECT NULL::integer")
  1119. if err != nil {
  1120. t.Fatal(err)
  1121. }
  1122. var n sql.NullInt64
  1123. if !r.Next() {
  1124. if r.Err() != nil {
  1125. t.Fatal(err)
  1126. }
  1127. t.Fatal("expected row")
  1128. }
  1129. if err := r.Scan(&n); err != nil {
  1130. t.Fatal(err)
  1131. }
  1132. if n.Int64 != 9 {
  1133. t.Fatalf("expected 2, not %d", n.Int64)
  1134. }
  1135. if !r.Next() {
  1136. if r.Err() != nil {
  1137. t.Fatal(err)
  1138. }
  1139. t.Fatal("expected row")
  1140. }
  1141. if err := r.Scan(&n); err != nil {
  1142. t.Fatal(err)
  1143. }
  1144. if n.Valid {
  1145. t.Fatal("expected n to be invalid")
  1146. }
  1147. if n.Int64 != 0 {
  1148. t.Fatalf("expected n to 2, not %d", n.Int64)
  1149. }
  1150. }
  1151. func Test64BitErrorChecking(t *testing.T) {
  1152. defer func() {
  1153. if err := recover(); err != nil {
  1154. t.Fatal("panic due to 0xFFFFFFFF != -1 " +
  1155. "when int is 64 bits")
  1156. }
  1157. }()
  1158. db := openTestConn(t)
  1159. defer db.Close()
  1160. r, err := db.Query(`SELECT *
  1161. FROM (VALUES (0::integer, NULL::text), (1, 'test string')) AS t;`)
  1162. if err != nil {
  1163. t.Fatal(err)
  1164. }
  1165. defer r.Close()
  1166. for r.Next() {
  1167. }
  1168. }
  1169. func TestCommit(t *testing.T) {
  1170. db := openTestConn(t)
  1171. defer db.Close()
  1172. _, err := db.Exec("CREATE TEMP TABLE temp (a int)")
  1173. if err != nil {
  1174. t.Fatal(err)
  1175. }
  1176. sqlInsert := "INSERT INTO temp VALUES (1)"
  1177. sqlSelect := "SELECT * FROM temp"
  1178. tx, err := db.Begin()
  1179. if err != nil {
  1180. t.Fatal(err)
  1181. }
  1182. _, err = tx.Exec(sqlInsert)
  1183. if err != nil {
  1184. t.Fatal(err)
  1185. }
  1186. err = tx.Commit()
  1187. if err != nil {
  1188. t.Fatal(err)
  1189. }
  1190. var i int
  1191. err = db.QueryRow(sqlSelect).Scan(&i)
  1192. if err != nil {
  1193. t.Fatal(err)
  1194. }
  1195. if i != 1 {
  1196. t.Fatalf("expected 1, got %d", i)
  1197. }
  1198. }
  1199. func TestErrorClass(t *testing.T) {
  1200. db := openTestConn(t)
  1201. defer db.Close()
  1202. _, err := db.Query("SELECT int 'notint'")
  1203. if err == nil {
  1204. t.Fatal("expected error")
  1205. }
  1206. pge, ok := err.(*Error)
  1207. if !ok {
  1208. t.Fatalf("expected *pq.Error, got %#+v", err)
  1209. }
  1210. if pge.Code.Class() != "22" {
  1211. t.Fatalf("expected class 28, got %v", pge.Code.Class())
  1212. }
  1213. if pge.Code.Class().Name() != "data_exception" {
  1214. t.Fatalf("expected data_exception, got %v", pge.Code.Class().Name())
  1215. }
  1216. }
  1217. func TestParseOpts(t *testing.T) {
  1218. tests := []struct {
  1219. in string
  1220. expected values
  1221. valid bool
  1222. }{
  1223. {"dbname=hello user=goodbye", values{"dbname": "hello", "user": "goodbye"}, true},
  1224. {"dbname=hello user=goodbye ", values{"dbname": "hello", "user": "goodbye"}, true},
  1225. {"dbname = hello user=goodbye", values{"dbname": "hello", "user": "goodbye"}, true},
  1226. {"dbname=hello user =goodbye", values{"dbname": "hello", "user": "goodbye"}, true},
  1227. {"dbname=hello user= goodbye", values{"dbname": "hello", "user": "goodbye"}, true},
  1228. {"host=localhost password='correct horse battery staple'", values{"host": "localhost", "password": "correct horse battery staple"}, true},
  1229. {"dbname=データベース password=パスワード", values{"dbname": "データベース", "password": "パスワード"}, true},
  1230. {"dbname=hello user=''", values{"dbname": "hello", "user": ""}, true},
  1231. {"user='' dbname=hello", values{"dbname": "hello", "user": ""}, true},
  1232. // The last option value is an empty string if there's no non-whitespace after its =
  1233. {"dbname=hello user= ", values{"dbname": "hello", "user": ""}, true},
  1234. // The parser ignores spaces after = and interprets the next set of non-whitespace characters as the value.
  1235. {"user= password=foo", values{"user": "password=foo"}, true},
  1236. // Backslash escapes next char
  1237. {`user=a\ \'\\b`, values{"user": `a '\b`}, true},
  1238. {`user='a \'b'`, values{"user": `a 'b`}, true},
  1239. // Incomplete escape
  1240. {`user=x\`, values{}, false},
  1241. // No '=' after the key
  1242. {"postgre://marko@internet", values{}, false},
  1243. {"dbname user=goodbye", values{}, false},
  1244. {"user=foo blah", values{}, false},
  1245. {"user=foo blah ", values{}, false},
  1246. // Unterminated quoted value
  1247. {"dbname=hello user='unterminated", values{}, false},
  1248. }
  1249. for _, test := range tests {
  1250. o := make(values)
  1251. err := parseOpts(test.in, o)
  1252. switch {
  1253. case err != nil && test.valid:
  1254. t.Errorf("%q got unexpected error: %s", test.in, err)
  1255. case err == nil && test.valid && !reflect.DeepEqual(test.expected, o):
  1256. t.Errorf("%q got: %#v want: %#v", test.in, o, test.expected)
  1257. case err == nil && !test.valid:
  1258. t.Errorf("%q expected an error", test.in)
  1259. }
  1260. }
  1261. }
  1262. func TestRuntimeParameters(t *testing.T) {
  1263. tests := []struct {
  1264. conninfo string
  1265. param string
  1266. expected string
  1267. success bool
  1268. }{
  1269. // invalid parameter
  1270. {"DOESNOTEXIST=foo", "", "", false},
  1271. // we can only work with a specific value for these two
  1272. {"client_encoding=SQL_ASCII", "", "", false},
  1273. {"datestyle='ISO, YDM'", "", "", false},
  1274. // "options" should work exactly as it does in libpq
  1275. {"options='-c search_path=pqgotest'", "search_path", "pqgotest", true},
  1276. // pq should override client_encoding in this case
  1277. {"options='-c client_encoding=SQL_ASCII'", "client_encoding", "UTF8", true},
  1278. // allow client_encoding to be set explicitly
  1279. {"client_encoding=UTF8", "client_encoding", "UTF8", true},
  1280. // test a runtime parameter not supported by libpq
  1281. {"work_mem='139kB'", "work_mem", "139kB", true},
  1282. // test fallback_application_name
  1283. {"application_name=foo fallback_application_name=bar", "application_name", "foo", true},
  1284. {"application_name='' fallback_application_name=bar", "application_name", "", true},
  1285. {"fallback_application_name=bar", "application_name", "bar", true},
  1286. }
  1287. for _, test := range tests {
  1288. db, err := openTestConnConninfo(test.conninfo)
  1289. if err != nil {
  1290. t.Fatal(err)
  1291. }
  1292. // application_name didn't exist before 9.0
  1293. if test.param == "application_name" && getServerVersion(t, db) < 90000 {
  1294. db.Close()
  1295. continue
  1296. }
  1297. tryGetParameterValue := func() (value string, success bool) {
  1298. defer db.Close()
  1299. row := db.QueryRow("SELECT current_setting($1)", test.param)
  1300. err = row.Scan(&value)
  1301. if err != nil {
  1302. return "", false
  1303. }
  1304. return value, true
  1305. }
  1306. value, success := tryGetParameterValue()
  1307. if success != test.success && !test.success {
  1308. t.Fatalf("%v: unexpected error: %v", test.conninfo, err)
  1309. }
  1310. if success != test.success {
  1311. t.Fatalf("unexpected outcome %v (was expecting %v) for conninfo \"%s\"",
  1312. success, test.success, test.conninfo)
  1313. }
  1314. if value != test.expected {
  1315. t.Fatalf("bad value for %s: got %s, want %s with conninfo \"%s\"",
  1316. test.param, value, test.expected, test.conninfo)
  1317. }
  1318. }
  1319. }
  1320. func TestIsUTF8(t *testing.T) {
  1321. var cases = []struct {
  1322. name string
  1323. want bool
  1324. }{
  1325. {"unicode", true},
  1326. {"utf-8", true},
  1327. {"utf_8", true},
  1328. {"UTF-8", true},
  1329. {"UTF8", true},
  1330. {"utf8", true},
  1331. {"u n ic_ode", true},
  1332. {"ut_f%8", true},
  1333. {"ubf8", false},
  1334. {"punycode", false},
  1335. }
  1336. for _, test := range cases {
  1337. if g := isUTF8(test.name); g != test.want {
  1338. t.Errorf("isUTF8(%q) = %v want %v", test.name, g, test.want)
  1339. }
  1340. }
  1341. }
  1342. func TestQuoteIdentifier(t *testing.T) {
  1343. var cases = []struct {
  1344. input string
  1345. want string
  1346. }{
  1347. {`foo`, `"foo"`},
  1348. {`foo bar baz`, `"foo bar baz"`},
  1349. {`foo"bar`, `"foo""bar"`},
  1350. {"foo\x00bar", `"foo"`},
  1351. {"\x00foo", `""`},
  1352. }
  1353. for _, test := range cases {
  1354. got := QuoteIdentifier(test.input)
  1355. if got != test.want {
  1356. t.Errorf("QuoteIdentifier(%q) = %v want %v", test.input, got, test.want)
  1357. }
  1358. }
  1359. }
  1360. func TestRowsResultTag(t *testing.T) {
  1361. type ResultTag interface {
  1362. Result() driver.Result
  1363. Tag() string
  1364. }
  1365. tests := []struct {
  1366. query string
  1367. tag string
  1368. ra int64
  1369. }{
  1370. {
  1371. query: "CREATE TEMP TABLE temp (a int)",
  1372. tag: "CREATE TABLE",
  1373. },
  1374. {
  1375. query: "INSERT INTO temp VALUES (1), (2)",
  1376. tag: "INSERT",
  1377. ra: 2,
  1378. },
  1379. {
  1380. query: "SELECT 1",
  1381. },
  1382. // A SELECT anywhere should take precedent.
  1383. {
  1384. query: "SELECT 1; INSERT INTO temp VALUES (1), (2)",
  1385. },
  1386. {
  1387. query: "INSERT INTO temp VALUES (1), (2); SELECT 1",
  1388. },
  1389. // Multiple statements that don't return rows should return the last tag.
  1390. {
  1391. query: "CREATE TEMP TABLE t (a int); DROP TABLE t",
  1392. tag: "DROP TABLE",
  1393. },
  1394. // Ensure a rows-returning query in any position among various tags-returing
  1395. // statements will prefer the rows.
  1396. {
  1397. query: "SELECT 1; CREATE TEMP TABLE t (a int); DROP TABLE t",
  1398. },
  1399. {
  1400. query: "CREATE TEMP TABLE t (a int); SELECT 1; DROP TABLE t",
  1401. },
  1402. {
  1403. query: "CREATE TEMP TABLE t (a int); DROP TABLE t; SELECT 1",
  1404. },
  1405. // Verify that an no-results query doesn't set the tag.
  1406. {
  1407. query: "CREATE TEMP TABLE t (a int); SELECT 1 WHERE FALSE; DROP TABLE t;",
  1408. },
  1409. }
  1410. // If this is the only test run, this will correct the connection string.
  1411. openTestConn(t).Close()
  1412. conn, err := Open("")
  1413. if err != nil {
  1414. t.Fatal(err)
  1415. }
  1416. defer conn.Close()
  1417. q := conn.(driver.QueryerContext)
  1418. for _, test := range tests {
  1419. if rows, err := q.QueryContext(context.Background(), test.query, nil); err != nil {
  1420. t.Fatalf("%s: %s", test.query, err)
  1421. } else {
  1422. r := rows.(ResultTag)
  1423. if tag := r.Tag(); tag != test.tag {
  1424. t.Fatalf("%s: unexpected tag %q", test.query, tag)
  1425. }
  1426. res := r.Result()
  1427. if ra, _ := res.RowsAffected(); ra != test.ra {
  1428. t.Fatalf("%s: unexpected rows affected: %d", test.query, ra)
  1429. }
  1430. rows.Close()
  1431. }
  1432. }
  1433. }
  1434. // TestQuickClose tests that closing a query early allows a subsequent query to work.
  1435. func TestQuickClose(t *testing.T) {
  1436. db := openTestConn(t)
  1437. defer db.Close()
  1438. tx, err := db.Begin()
  1439. if err != nil {
  1440. t.Fatal(err)
  1441. }
  1442. rows, err := tx.Query("SELECT 1; SELECT 2;")
  1443. if err != nil {
  1444. t.Fatal(err)
  1445. }
  1446. if err := rows.Close(); err != nil {
  1447. t.Fatal(err)
  1448. }
  1449. var id int
  1450. if err := tx.QueryRow("SELECT 3").Scan(&id); err != nil {
  1451. t.Fatal(err)
  1452. }
  1453. if id != 3 {
  1454. t.Fatalf("unexpected %d", id)
  1455. }
  1456. if err := tx.Commit(); err != nil {
  1457. t.Fatal(err)
  1458. }
  1459. }