conn_test.go 35 KB

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