conn_test.go 27 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286
  1. package pq
  2. import (
  3. "database/sql"
  4. "database/sql/driver"
  5. "fmt"
  6. "io"
  7. "os"
  8. "reflect"
  9. "testing"
  10. "time"
  11. )
  12. type Fatalistic interface {
  13. Fatal(args ...interface{})
  14. }
  15. func openTestConnConninfo(conninfo string) (*sql.DB, error) {
  16. datname := os.Getenv("PGDATABASE")
  17. sslmode := os.Getenv("PGSSLMODE")
  18. timeout := os.Getenv("PGCONNECT_TIMEOUT")
  19. if datname == "" {
  20. os.Setenv("PGDATABASE", "pqgotest")
  21. }
  22. if sslmode == "" {
  23. os.Setenv("PGSSLMODE", "disable")
  24. }
  25. if timeout == "" {
  26. os.Setenv("PGCONNECT_TIMEOUT", "20")
  27. }
  28. return sql.Open("postgres", conninfo)
  29. }
  30. func openTestConn(t Fatalistic) *sql.DB {
  31. conn, err := openTestConnConninfo("")
  32. if err != nil {
  33. t.Fatal(err)
  34. }
  35. return conn
  36. }
  37. func getServerVersion(t *testing.T, db *sql.DB) int {
  38. var version int
  39. err := db.QueryRow("SHOW server_version_num").Scan(&version)
  40. if err != nil {
  41. t.Fatal(err)
  42. }
  43. return version
  44. }
  45. func TestReconnect(t *testing.T) {
  46. db1 := openTestConn(t)
  47. defer db1.Close()
  48. tx, err := db1.Begin()
  49. if err != nil {
  50. t.Fatal(err)
  51. }
  52. var pid1 int
  53. err = tx.QueryRow("SELECT pg_backend_pid()").Scan(&pid1)
  54. if err != nil {
  55. t.Fatal(err)
  56. }
  57. db2 := openTestConn(t)
  58. defer db2.Close()
  59. _, err = db2.Exec("SELECT pg_terminate_backend($1)", pid1)
  60. if err != nil {
  61. t.Fatal(err)
  62. }
  63. // The rollback will probably "fail" because we just killed
  64. // its connection above
  65. _ = tx.Rollback()
  66. const expected int = 42
  67. var result int
  68. err = db1.QueryRow(fmt.Sprintf("SELECT %d", expected)).Scan(&result)
  69. if err != nil {
  70. t.Fatal(err)
  71. }
  72. if result != expected {
  73. t.Errorf("got %v; expected %v", result, expected)
  74. }
  75. }
  76. func TestCommitInFailedTransaction(t *testing.T) {
  77. db := openTestConn(t)
  78. defer db.Close()
  79. txn, err := db.Begin()
  80. if err != nil {
  81. t.Fatal(err)
  82. }
  83. rows, err := txn.Query("SELECT error")
  84. if err == nil {
  85. rows.Close()
  86. t.Fatal("expected failure")
  87. }
  88. err = txn.Commit()
  89. if err != ErrInFailedTransaction {
  90. t.Fatalf("expected ErrInFailedTransaction; got %#v", err)
  91. }
  92. }
  93. func TestOpenURL(t *testing.T) {
  94. db, err := openTestConnConninfo("postgres://")
  95. if err != nil {
  96. t.Fatal(err)
  97. }
  98. defer db.Close()
  99. // database/sql might not call our Open at all unless we do something with
  100. // the connection
  101. txn, err := db.Begin()
  102. if err != nil {
  103. t.Fatal(err)
  104. }
  105. txn.Rollback()
  106. }
  107. func TestExec(t *testing.T) {
  108. db := openTestConn(t)
  109. defer db.Close()
  110. _, err := db.Exec("CREATE TEMP TABLE temp (a int)")
  111. if err != nil {
  112. t.Fatal(err)
  113. }
  114. r, err := db.Exec("INSERT INTO temp VALUES (1)")
  115. if err != nil {
  116. t.Fatal(err)
  117. }
  118. if n, _ := r.RowsAffected(); n != 1 {
  119. t.Fatalf("expected 1 row affected, not %d", n)
  120. }
  121. r, err = db.Exec("INSERT INTO temp VALUES ($1), ($2), ($3)", 1, 2, 3)
  122. if err != nil {
  123. t.Fatal(err)
  124. }
  125. if n, _ := r.RowsAffected(); n != 3 {
  126. t.Fatalf("expected 3 rows affected, not %d", n)
  127. }
  128. // SELECT doesn't send the number of returned rows in the command tag
  129. // before 9.0
  130. if getServerVersion(t, db) >= 90000 {
  131. r, err = db.Exec("SELECT g FROM generate_series(1, 2) g")
  132. if err != nil {
  133. t.Fatal(err)
  134. }
  135. if n, _ := r.RowsAffected(); n != 2 {
  136. t.Fatalf("expected 2 rows affected, not %d", n)
  137. }
  138. r, err = db.Exec("SELECT g FROM generate_series(1, $1) g", 3)
  139. if err != nil {
  140. t.Fatal(err)
  141. }
  142. if n, _ := r.RowsAffected(); n != 3 {
  143. t.Fatalf("expected 3 rows affected, not %d", n)
  144. }
  145. }
  146. }
  147. func TestStatment(t *testing.T) {
  148. db := openTestConn(t)
  149. defer db.Close()
  150. st, err := db.Prepare("SELECT 1")
  151. if err != nil {
  152. t.Fatal(err)
  153. }
  154. st1, err := db.Prepare("SELECT 2")
  155. if err != nil {
  156. t.Fatal(err)
  157. }
  158. r, err := st.Query()
  159. if err != nil {
  160. t.Fatal(err)
  161. }
  162. defer r.Close()
  163. if !r.Next() {
  164. t.Fatal("expected row")
  165. }
  166. var i int
  167. err = r.Scan(&i)
  168. if err != nil {
  169. t.Fatal(err)
  170. }
  171. if i != 1 {
  172. t.Fatalf("expected 1, got %d", i)
  173. }
  174. // st1
  175. r1, err := st1.Query()
  176. if err != nil {
  177. t.Fatal(err)
  178. }
  179. defer r1.Close()
  180. if !r1.Next() {
  181. if r.Err() != nil {
  182. t.Fatal(r1.Err())
  183. }
  184. t.Fatal("expected row")
  185. }
  186. err = r1.Scan(&i)
  187. if err != nil {
  188. t.Fatal(err)
  189. }
  190. if i != 2 {
  191. t.Fatalf("expected 2, got %d", i)
  192. }
  193. }
  194. func TestRowsCloseBeforeDone(t *testing.T) {
  195. db := openTestConn(t)
  196. defer db.Close()
  197. r, err := db.Query("SELECT 1")
  198. if err != nil {
  199. t.Fatal(err)
  200. }
  201. err = r.Close()
  202. if err != nil {
  203. t.Fatal(err)
  204. }
  205. if r.Next() {
  206. t.Fatal("unexpected row")
  207. }
  208. if r.Err() != nil {
  209. t.Fatal(r.Err())
  210. }
  211. }
  212. func TestParameterCountMismatch(t *testing.T) {
  213. db := openTestConn(t)
  214. defer db.Close()
  215. var notused int
  216. err := db.QueryRow("SELECT false", 1).Scan(&notused)
  217. if err == nil {
  218. t.Fatal("expected err")
  219. }
  220. // make sure we clean up correctly
  221. err = db.QueryRow("SELECT 1").Scan(&notused)
  222. if err != nil {
  223. t.Fatal(err)
  224. }
  225. err = db.QueryRow("SELECT $1").Scan(&notused)
  226. if err == nil {
  227. t.Fatal("expected err")
  228. }
  229. // make sure we clean up correctly
  230. err = db.QueryRow("SELECT 1").Scan(&notused)
  231. if err != nil {
  232. t.Fatal(err)
  233. }
  234. }
  235. // Test that EmptyQueryResponses are handled correctly.
  236. func TestEmptyQuery(t *testing.T) {
  237. db := openTestConn(t)
  238. defer db.Close()
  239. _, err := db.Exec("")
  240. if err != nil {
  241. t.Fatal(err)
  242. }
  243. rows, err := db.Query("")
  244. if err != nil {
  245. t.Fatal(err)
  246. }
  247. cols, err := rows.Columns()
  248. if err != nil {
  249. t.Fatal(err)
  250. }
  251. if len(cols) != 0 {
  252. t.Fatalf("unexpected number of columns %d in response to an empty query", len(cols))
  253. }
  254. if rows.Next() {
  255. t.Fatal("unexpected row")
  256. }
  257. if rows.Err() != nil {
  258. t.Fatal(rows.Err())
  259. }
  260. stmt, err := db.Prepare("")
  261. if err != nil {
  262. t.Fatal(err)
  263. }
  264. _, err = stmt.Exec()
  265. if err != nil {
  266. t.Fatal(err)
  267. }
  268. rows, err = stmt.Query()
  269. if err != nil {
  270. t.Fatal(err)
  271. }
  272. cols, err = rows.Columns()
  273. if err != nil {
  274. t.Fatal(err)
  275. }
  276. if len(cols) != 0 {
  277. t.Fatalf("unexpected number of columns %d in response to an empty query", len(cols))
  278. }
  279. if rows.Next() {
  280. t.Fatal("unexpected row")
  281. }
  282. if rows.Err() != nil {
  283. t.Fatal(rows.Err())
  284. }
  285. }
  286. func TestEncodeDecode(t *testing.T) {
  287. db := openTestConn(t)
  288. defer db.Close()
  289. q := `
  290. SELECT
  291. E'\\000\\001\\002'::bytea,
  292. 'foobar'::text,
  293. NULL::integer,
  294. '2000-1-1 01:02:03.04-7'::timestamptz,
  295. 0::boolean,
  296. 123,
  297. 3.14::float8
  298. WHERE
  299. E'\\000\\001\\002'::bytea = $1
  300. AND 'foobar'::text = $2
  301. AND $3::integer is NULL
  302. `
  303. // AND '2000-1-1 12:00:00.000000-7'::timestamp = $3
  304. exp1 := []byte{0, 1, 2}
  305. exp2 := "foobar"
  306. r, err := db.Query(q, exp1, exp2, nil)
  307. if err != nil {
  308. t.Fatal(err)
  309. }
  310. defer r.Close()
  311. if !r.Next() {
  312. if r.Err() != nil {
  313. t.Fatal(r.Err())
  314. }
  315. t.Fatal("expected row")
  316. }
  317. var got1 []byte
  318. var got2 string
  319. var got3 = sql.NullInt64{Valid: true}
  320. var got4 time.Time
  321. var got5, got6, got7 interface{}
  322. err = r.Scan(&got1, &got2, &got3, &got4, &got5, &got6, &got7)
  323. if err != nil {
  324. t.Fatal(err)
  325. }
  326. if !reflect.DeepEqual(exp1, got1) {
  327. t.Errorf("expected %q byte: %q", exp1, got1)
  328. }
  329. if !reflect.DeepEqual(exp2, got2) {
  330. t.Errorf("expected %q byte: %q", exp2, got2)
  331. }
  332. if got3.Valid {
  333. t.Fatal("expected invalid")
  334. }
  335. if got4.Year() != 2000 {
  336. t.Fatal("wrong year")
  337. }
  338. if got5 != false {
  339. t.Fatalf("expected false, got %q", got5)
  340. }
  341. if got6 != int64(123) {
  342. t.Fatalf("expected 123, got %d", got6)
  343. }
  344. if got7 != float64(3.14) {
  345. t.Fatalf("expected 3.14, got %f", got7)
  346. }
  347. }
  348. func TestNoData(t *testing.T) {
  349. db := openTestConn(t)
  350. defer db.Close()
  351. st, err := db.Prepare("SELECT 1 WHERE true = false")
  352. if err != nil {
  353. t.Fatal(err)
  354. }
  355. defer st.Close()
  356. r, err := st.Query()
  357. if err != nil {
  358. t.Fatal(err)
  359. }
  360. defer r.Close()
  361. if r.Next() {
  362. if r.Err() != nil {
  363. t.Fatal(r.Err())
  364. }
  365. t.Fatal("unexpected row")
  366. }
  367. _, err = db.Query("SELECT * FROM nonexistenttable WHERE age=$1", 20)
  368. if err == nil {
  369. t.Fatal("Should have raised an error on non existent table")
  370. }
  371. _, err = db.Query("SELECT * FROM nonexistenttable")
  372. if err == nil {
  373. t.Fatal("Should have raised an error on non existent table")
  374. }
  375. }
  376. func TestErrorDuringStartup(t *testing.T) {
  377. // Don't use the normal connection setup, this is intended to
  378. // blow up in the startup packet from a non-existent user.
  379. db, err := openTestConnConninfo("user=thisuserreallydoesntexist")
  380. if err != nil {
  381. t.Fatal(err)
  382. }
  383. defer db.Close()
  384. _, err = db.Begin()
  385. if err == nil {
  386. t.Fatal("expected error")
  387. }
  388. e, ok := err.(*Error)
  389. if !ok {
  390. t.Fatalf("expected Error, got %#v", err)
  391. } else if e.Code.Name() != "invalid_authorization_specification" && e.Code.Name() != "invalid_password" {
  392. t.Fatalf("expected invalid_authorization_specification or invalid_password, got %s (%+v)", e.Code.Name(), err)
  393. }
  394. }
  395. func TestBadConn(t *testing.T) {
  396. var err error
  397. cn := conn{}
  398. func() {
  399. defer cn.errRecover(&err)
  400. panic(io.EOF)
  401. }()
  402. if err != driver.ErrBadConn {
  403. t.Fatalf("expected driver.ErrBadConn, got: %#v", err)
  404. }
  405. if !cn.bad {
  406. t.Fatalf("expected cn.bad")
  407. }
  408. cn = conn{}
  409. func() {
  410. defer cn.errRecover(&err)
  411. e := &Error{Severity: Efatal}
  412. panic(e)
  413. }()
  414. if err != driver.ErrBadConn {
  415. t.Fatalf("expected driver.ErrBadConn, got: %#v", err)
  416. }
  417. if !cn.bad {
  418. t.Fatalf("expected cn.bad")
  419. }
  420. }
  421. func TestErrorOnExec(t *testing.T) {
  422. db := openTestConn(t)
  423. defer db.Close()
  424. txn, err := db.Begin()
  425. if err != nil {
  426. t.Fatal(err)
  427. }
  428. defer txn.Rollback()
  429. _, err = txn.Exec("CREATE TEMPORARY TABLE foo(f1 int PRIMARY KEY)")
  430. if err != nil {
  431. t.Fatal(err)
  432. }
  433. _, err = txn.Exec("INSERT INTO foo VALUES (0), (0)")
  434. if err == nil {
  435. t.Fatal("Should have raised error")
  436. }
  437. e, ok := err.(*Error)
  438. if !ok {
  439. t.Fatalf("expected Error, got %#v", err)
  440. } else if e.Code.Name() != "unique_violation" {
  441. t.Fatalf("expected unique_violation, got %s (%+v)", e.Code.Name(), err)
  442. }
  443. }
  444. func TestErrorOnQuery(t *testing.T) {
  445. db := openTestConn(t)
  446. defer db.Close()
  447. txn, err := db.Begin()
  448. if err != nil {
  449. t.Fatal(err)
  450. }
  451. defer txn.Rollback()
  452. _, err = txn.Exec("CREATE TEMPORARY TABLE foo(f1 int PRIMARY KEY)")
  453. if err != nil {
  454. t.Fatal(err)
  455. }
  456. _, err = txn.Query("INSERT INTO foo VALUES (0), (0)")
  457. if err == nil {
  458. t.Fatal("Should have raised error")
  459. }
  460. e, ok := err.(*Error)
  461. if !ok {
  462. t.Fatalf("expected Error, got %#v", err)
  463. } else if e.Code.Name() != "unique_violation" {
  464. t.Fatalf("expected unique_violation, got %s (%+v)", e.Code.Name(), err)
  465. }
  466. }
  467. func TestErrorOnQueryRowSimpleQuery(t *testing.T) {
  468. db := openTestConn(t)
  469. defer db.Close()
  470. txn, err := db.Begin()
  471. if err != nil {
  472. t.Fatal(err)
  473. }
  474. defer txn.Rollback()
  475. _, err = txn.Exec("CREATE TEMPORARY TABLE foo(f1 int PRIMARY KEY)")
  476. if err != nil {
  477. t.Fatal(err)
  478. }
  479. var v int
  480. err = txn.QueryRow("INSERT INTO foo VALUES (0), (0)").Scan(&v)
  481. if err == nil {
  482. t.Fatal("Should have raised error")
  483. }
  484. e, ok := err.(*Error)
  485. if !ok {
  486. t.Fatalf("expected Error, got %#v", err)
  487. } else if e.Code.Name() != "unique_violation" {
  488. t.Fatalf("expected unique_violation, got %s (%+v)", e.Code.Name(), err)
  489. }
  490. }
  491. // Test the QueryRow bug workarounds in stmt.exec() and simpleQuery()
  492. func TestQueryRowBugWorkaround(t *testing.T) {
  493. db := openTestConn(t)
  494. defer db.Close()
  495. // stmt.exec()
  496. _, err := db.Exec("CREATE TEMP TABLE notnulltemp (a varchar(10) not null)")
  497. if err != nil {
  498. t.Fatal(err)
  499. }
  500. var a string
  501. err = db.QueryRow("INSERT INTO notnulltemp(a) values($1) RETURNING a", nil).Scan(&a)
  502. if err == sql.ErrNoRows {
  503. t.Fatalf("expected constraint violation error; got: %v", err)
  504. }
  505. pge, ok := err.(*Error)
  506. if !ok {
  507. t.Fatalf("expected *Error; got: %#v", err)
  508. }
  509. if pge.Code.Name() != "not_null_violation" {
  510. t.Fatalf("expected not_null_violation; got: %s (%+v)", pge.Code.Name(), err)
  511. }
  512. // Test workaround in simpleQuery()
  513. tx, err := db.Begin()
  514. if err != nil {
  515. t.Fatalf("unexpected error %s in Begin", err)
  516. }
  517. defer tx.Rollback()
  518. _, err = tx.Exec("SET LOCAL check_function_bodies TO FALSE")
  519. if err != nil {
  520. t.Fatalf("could not disable check_function_bodies: %s", err)
  521. }
  522. _, err = tx.Exec(`
  523. CREATE OR REPLACE FUNCTION bad_function()
  524. RETURNS integer
  525. -- hack to prevent the function from being inlined
  526. SET check_function_bodies TO TRUE
  527. AS $$
  528. SELECT text 'bad'
  529. $$ LANGUAGE sql`)
  530. if err != nil {
  531. t.Fatalf("could not create function: %s", err)
  532. }
  533. err = tx.QueryRow("SELECT * FROM bad_function()").Scan(&a)
  534. if err == nil {
  535. t.Fatalf("expected error")
  536. }
  537. pge, ok = err.(*Error)
  538. if !ok {
  539. t.Fatalf("expected *Error; got: %#v", err)
  540. }
  541. if pge.Code.Name() != "invalid_function_definition" {
  542. t.Fatalf("expected invalid_function_definition; got: %s (%+v)", pge.Code.Name(), err)
  543. }
  544. err = tx.Rollback()
  545. if err != nil {
  546. t.Fatalf("unexpected error %s in Rollback", err)
  547. }
  548. // Also test that simpleQuery()'s workaround works when the query fails
  549. // after a row has been received.
  550. rows, err := db.Query(`
  551. select
  552. (select generate_series(1, ss.i))
  553. from (select gs.i
  554. from generate_series(1, 2) gs(i)
  555. order by gs.i limit 2) ss`)
  556. if err != nil {
  557. t.Fatalf("query failed: %s", err)
  558. }
  559. if !rows.Next() {
  560. t.Fatalf("expected at least one result row; got %s", rows.Err())
  561. }
  562. var i int
  563. err = rows.Scan(&i)
  564. if err != nil {
  565. t.Fatalf("rows.Scan() failed: %s", err)
  566. }
  567. if i != 1 {
  568. t.Fatalf("unexpected value for i: %d", i)
  569. }
  570. if rows.Next() {
  571. t.Fatalf("unexpected row")
  572. }
  573. pge, ok = rows.Err().(*Error)
  574. if !ok {
  575. t.Fatalf("expected *Error; got: %#v", err)
  576. }
  577. if pge.Code.Name() != "cardinality_violation" {
  578. t.Fatalf("expected cardinality_violation; got: %s (%+v)", pge.Code.Name(), rows.Err())
  579. }
  580. }
  581. func TestSimpleQuery(t *testing.T) {
  582. db := openTestConn(t)
  583. defer db.Close()
  584. r, err := db.Query("select 1")
  585. if err != nil {
  586. t.Fatal(err)
  587. }
  588. defer r.Close()
  589. if !r.Next() {
  590. t.Fatal("expected row")
  591. }
  592. }
  593. func TestBindError(t *testing.T) {
  594. db := openTestConn(t)
  595. defer db.Close()
  596. _, err := db.Exec("create temp table test (i integer)")
  597. if err != nil {
  598. t.Fatal(err)
  599. }
  600. _, err = db.Query("select * from test where i=$1", "hhh")
  601. if err == nil {
  602. t.Fatal("expected an error")
  603. }
  604. // Should not get error here
  605. r, err := db.Query("select * from test where i=$1", 1)
  606. if err != nil {
  607. t.Fatal(err)
  608. }
  609. defer r.Close()
  610. }
  611. func TestParseErrorInExtendedQuery(t *testing.T) {
  612. db := openTestConn(t)
  613. defer db.Close()
  614. rows, err := db.Query("PARSE_ERROR $1", 1)
  615. if err == nil {
  616. t.Fatal("expected error")
  617. }
  618. rows, err = db.Query("SELECT 1")
  619. if err != nil {
  620. t.Fatal(err)
  621. }
  622. rows.Close()
  623. }
  624. // TestReturning tests that an INSERT query using the RETURNING clause returns a row.
  625. func TestReturning(t *testing.T) {
  626. db := openTestConn(t)
  627. defer db.Close()
  628. _, err := db.Exec("CREATE TEMP TABLE distributors (did integer default 0, dname text)")
  629. if err != nil {
  630. t.Fatal(err)
  631. }
  632. rows, err := db.Query("INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets') " +
  633. "RETURNING did;")
  634. if err != nil {
  635. t.Fatal(err)
  636. }
  637. if !rows.Next() {
  638. t.Fatal("no rows")
  639. }
  640. var did int
  641. err = rows.Scan(&did)
  642. if err != nil {
  643. t.Fatal(err)
  644. }
  645. if did != 0 {
  646. t.Fatalf("bad value for did: got %d, want %d", did, 0)
  647. }
  648. if rows.Next() {
  649. t.Fatal("unexpected next row")
  650. }
  651. err = rows.Err()
  652. if err != nil {
  653. t.Fatal(err)
  654. }
  655. }
  656. func TestIssue186(t *testing.T) {
  657. db := openTestConn(t)
  658. defer db.Close()
  659. // Exec() a query which returns results
  660. _, err := db.Exec("VALUES (1), (2), (3)")
  661. if err != nil {
  662. t.Fatal(err)
  663. }
  664. _, err = db.Exec("VALUES ($1), ($2), ($3)", 1, 2, 3)
  665. if err != nil {
  666. t.Fatal(err)
  667. }
  668. // Query() a query which doesn't return any results
  669. txn, err := db.Begin()
  670. if err != nil {
  671. t.Fatal(err)
  672. }
  673. defer txn.Rollback()
  674. rows, err := txn.Query("CREATE TEMP TABLE foo(f1 int)")
  675. if err != nil {
  676. t.Fatal(err)
  677. }
  678. if err = rows.Close(); err != nil {
  679. t.Fatal(err)
  680. }
  681. // small trick to get NoData from a parameterized query
  682. _, err = txn.Exec("CREATE RULE nodata AS ON INSERT TO foo DO INSTEAD NOTHING")
  683. if err != nil {
  684. t.Fatal(err)
  685. }
  686. rows, err = txn.Query("INSERT INTO foo VALUES ($1)", 1)
  687. if err != nil {
  688. t.Fatal(err)
  689. }
  690. if err = rows.Close(); err != nil {
  691. t.Fatal(err)
  692. }
  693. }
  694. func TestIssue196(t *testing.T) {
  695. db := openTestConn(t)
  696. defer db.Close()
  697. row := db.QueryRow("SELECT float4 '0.10000122' = $1, float8 '35.03554004971999' = $2",
  698. float32(0.10000122), float64(35.03554004971999))
  699. var float4match, float8match bool
  700. err := row.Scan(&float4match, &float8match)
  701. if err != nil {
  702. t.Fatal(err)
  703. }
  704. if !float4match {
  705. t.Errorf("Expected float4 fidelity to be maintained; got no match")
  706. }
  707. if !float8match {
  708. t.Errorf("Expected float8 fidelity to be maintained; got no match")
  709. }
  710. }
  711. // Test that any CommandComplete messages sent before the query results are
  712. // ignored.
  713. func TestIssue282(t *testing.T) {
  714. db := openTestConn(t)
  715. defer db.Close()
  716. var search_path string
  717. err := db.QueryRow(`
  718. SET LOCAL search_path TO pg_catalog;
  719. SET LOCAL search_path TO pg_catalog;
  720. SHOW search_path`).Scan(&search_path)
  721. if err != nil {
  722. t.Fatal(err)
  723. }
  724. if search_path != "pg_catalog" {
  725. t.Fatalf("unexpected search_path %s", search_path)
  726. }
  727. }
  728. func TestReadFloatPrecision(t *testing.T) {
  729. db := openTestConn(t)
  730. defer db.Close()
  731. row := db.QueryRow("SELECT float4 '0.10000122', float8 '35.03554004971999'")
  732. var float4val float32
  733. var float8val float64
  734. err := row.Scan(&float4val, &float8val)
  735. if err != nil {
  736. t.Fatal(err)
  737. }
  738. if float4val != float32(0.10000122) {
  739. t.Errorf("Expected float4 fidelity to be maintained; got no match")
  740. }
  741. if float8val != float64(35.03554004971999) {
  742. t.Errorf("Expected float8 fidelity to be maintained; got no match")
  743. }
  744. }
  745. func TestXactMultiStmt(t *testing.T) {
  746. // minified test case based on bug reports from
  747. // pico303@gmail.com and rangelspam@gmail.com
  748. t.Skip("Skipping failing test")
  749. db := openTestConn(t)
  750. defer db.Close()
  751. tx, err := db.Begin()
  752. if err != nil {
  753. t.Fatal(err)
  754. }
  755. defer tx.Commit()
  756. rows, err := tx.Query("select 1")
  757. if err != nil {
  758. t.Fatal(err)
  759. }
  760. if rows.Next() {
  761. var val int32
  762. if err = rows.Scan(&val); err != nil {
  763. t.Fatal(err)
  764. }
  765. } else {
  766. t.Fatal("Expected at least one row in first query in xact")
  767. }
  768. rows2, err := tx.Query("select 2")
  769. if err != nil {
  770. t.Fatal(err)
  771. }
  772. if rows2.Next() {
  773. var val2 int32
  774. if err := rows2.Scan(&val2); err != nil {
  775. t.Fatal(err)
  776. }
  777. } else {
  778. t.Fatal("Expected at least one row in second query in xact")
  779. }
  780. if err = rows.Err(); err != nil {
  781. t.Fatal(err)
  782. }
  783. if err = rows2.Err(); err != nil {
  784. t.Fatal(err)
  785. }
  786. if err = tx.Commit(); err != nil {
  787. t.Fatal(err)
  788. }
  789. }
  790. var envParseTests = []struct {
  791. Expected map[string]string
  792. Env []string
  793. }{
  794. {
  795. Env: []string{"PGDATABASE=hello", "PGUSER=goodbye"},
  796. Expected: map[string]string{"dbname": "hello", "user": "goodbye"},
  797. },
  798. {
  799. Env: []string{"PGDATESTYLE=ISO, MDY"},
  800. Expected: map[string]string{"datestyle": "ISO, MDY"},
  801. },
  802. {
  803. Env: []string{"PGCONNECT_TIMEOUT=30"},
  804. Expected: map[string]string{"connect_timeout": "30"},
  805. },
  806. }
  807. func TestParseEnviron(t *testing.T) {
  808. for i, tt := range envParseTests {
  809. results := parseEnviron(tt.Env)
  810. if !reflect.DeepEqual(tt.Expected, results) {
  811. t.Errorf("%d: Expected: %#v Got: %#v", i, tt.Expected, results)
  812. }
  813. }
  814. }
  815. func TestParseComplete(t *testing.T) {
  816. tpc := func(commandTag string, command string, affectedRows int64, shouldFail bool) {
  817. defer func() {
  818. if p := recover(); p != nil {
  819. if !shouldFail {
  820. t.Error(p)
  821. }
  822. }
  823. }()
  824. cn := &conn{}
  825. res, c := cn.parseComplete(commandTag)
  826. if c != command {
  827. t.Errorf("Expected %v, got %v", command, c)
  828. }
  829. n, err := res.RowsAffected()
  830. if err != nil {
  831. t.Fatal(err)
  832. }
  833. if n != affectedRows {
  834. t.Errorf("Expected %d, got %d", affectedRows, n)
  835. }
  836. }
  837. tpc("ALTER TABLE", "ALTER TABLE", 0, false)
  838. tpc("INSERT 0 1", "INSERT", 1, false)
  839. tpc("UPDATE 100", "UPDATE", 100, false)
  840. tpc("SELECT 100", "SELECT", 100, false)
  841. tpc("FETCH 100", "FETCH", 100, false)
  842. // allow COPY (and others) without row count
  843. tpc("COPY", "COPY", 0, false)
  844. // don't fail on command tags we don't recognize
  845. tpc("UNKNOWNCOMMANDTAG", "UNKNOWNCOMMANDTAG", 0, false)
  846. // failure cases
  847. tpc("INSERT 1", "", 0, true) // missing oid
  848. tpc("UPDATE 0 1", "", 0, true) // too many numbers
  849. tpc("SELECT foo", "", 0, true) // invalid row count
  850. }
  851. func TestExecerInterface(t *testing.T) {
  852. // Gin up a straw man private struct just for the type check
  853. cn := &conn{c: nil}
  854. var cni interface{} = cn
  855. _, ok := cni.(driver.Execer)
  856. if !ok {
  857. t.Fatal("Driver doesn't implement Execer")
  858. }
  859. }
  860. func TestNullAfterNonNull(t *testing.T) {
  861. db := openTestConn(t)
  862. defer db.Close()
  863. r, err := db.Query("SELECT 9::integer UNION SELECT NULL::integer")
  864. if err != nil {
  865. t.Fatal(err)
  866. }
  867. var n sql.NullInt64
  868. if !r.Next() {
  869. if r.Err() != nil {
  870. t.Fatal(err)
  871. }
  872. t.Fatal("expected row")
  873. }
  874. if err := r.Scan(&n); err != nil {
  875. t.Fatal(err)
  876. }
  877. if n.Int64 != 9 {
  878. t.Fatalf("expected 2, not %d", n.Int64)
  879. }
  880. if !r.Next() {
  881. if r.Err() != nil {
  882. t.Fatal(err)
  883. }
  884. t.Fatal("expected row")
  885. }
  886. if err := r.Scan(&n); err != nil {
  887. t.Fatal(err)
  888. }
  889. if n.Valid {
  890. t.Fatal("expected n to be invalid")
  891. }
  892. if n.Int64 != 0 {
  893. t.Fatalf("expected n to 2, not %d", n.Int64)
  894. }
  895. }
  896. func Test64BitErrorChecking(t *testing.T) {
  897. defer func() {
  898. if err := recover(); err != nil {
  899. t.Fatal("panic due to 0xFFFFFFFF != -1 " +
  900. "when int is 64 bits")
  901. }
  902. }()
  903. db := openTestConn(t)
  904. defer db.Close()
  905. r, err := db.Query(`SELECT *
  906. FROM (VALUES (0::integer, NULL::text), (1, 'test string')) AS t;`)
  907. if err != nil {
  908. t.Fatal(err)
  909. }
  910. defer r.Close()
  911. for r.Next() {
  912. }
  913. }
  914. func TestCommit(t *testing.T) {
  915. db := openTestConn(t)
  916. defer db.Close()
  917. _, err := db.Exec("CREATE TEMP TABLE temp (a int)")
  918. if err != nil {
  919. t.Fatal(err)
  920. }
  921. sqlInsert := "INSERT INTO temp VALUES (1)"
  922. sqlSelect := "SELECT * FROM temp"
  923. tx, err := db.Begin()
  924. if err != nil {
  925. t.Fatal(err)
  926. }
  927. _, err = tx.Exec(sqlInsert)
  928. if err != nil {
  929. t.Fatal(err)
  930. }
  931. err = tx.Commit()
  932. if err != nil {
  933. t.Fatal(err)
  934. }
  935. var i int
  936. err = db.QueryRow(sqlSelect).Scan(&i)
  937. if err != nil {
  938. t.Fatal(err)
  939. }
  940. if i != 1 {
  941. t.Fatalf("expected 1, got %d", i)
  942. }
  943. }
  944. func TestErrorClass(t *testing.T) {
  945. db := openTestConn(t)
  946. defer db.Close()
  947. _, err := db.Query("SELECT int 'notint'")
  948. if err == nil {
  949. t.Fatal("expected error")
  950. }
  951. pge, ok := err.(*Error)
  952. if !ok {
  953. t.Fatalf("expected *pq.Error, got %#+v", err)
  954. }
  955. if pge.Code.Class() != "22" {
  956. t.Fatalf("expected class 28, got %v", pge.Code.Class())
  957. }
  958. if pge.Code.Class().Name() != "data_exception" {
  959. t.Fatalf("expected data_exception, got %v", pge.Code.Class().Name())
  960. }
  961. }
  962. func TestParseOpts(t *testing.T) {
  963. tests := []struct {
  964. in string
  965. expected values
  966. valid bool
  967. }{
  968. {"dbname=hello user=goodbye", values{"dbname": "hello", "user": "goodbye"}, true},
  969. {"dbname=hello user=goodbye ", values{"dbname": "hello", "user": "goodbye"}, true},
  970. {"dbname = hello user=goodbye", values{"dbname": "hello", "user": "goodbye"}, true},
  971. {"dbname=hello user =goodbye", values{"dbname": "hello", "user": "goodbye"}, true},
  972. {"dbname=hello user= goodbye", values{"dbname": "hello", "user": "goodbye"}, true},
  973. {"host=localhost password='correct horse battery staple'", values{"host": "localhost", "password": "correct horse battery staple"}, true},
  974. {"dbname=データベース password=パスワード", values{"dbname": "データベース", "password": "パスワード"}, true},
  975. {"dbname=hello user=''", values{"dbname": "hello", "user": ""}, true},
  976. {"user='' dbname=hello", values{"dbname": "hello", "user": ""}, true},
  977. // The last option value is an empty string if there's no non-whitespace after its =
  978. {"dbname=hello user= ", values{"dbname": "hello", "user": ""}, true},
  979. // The parser ignores spaces after = and interprets the next set of non-whitespace characters as the value.
  980. {"user= password=foo", values{"user": "password=foo"}, true},
  981. // Backslash escapes next char
  982. {`user=a\ \'\\b`, values{"user": `a '\b`}, true},
  983. {`user='a \'b'`, values{"user": `a 'b`}, true},
  984. // Incomplete escape
  985. {`user=x\`, values{}, false},
  986. // No '=' after the key
  987. {"postgre://marko@internet", values{}, false},
  988. {"dbname user=goodbye", values{}, false},
  989. {"user=foo blah", values{}, false},
  990. {"user=foo blah ", values{}, false},
  991. // Unterminated quoted value
  992. {"dbname=hello user='unterminated", values{}, false},
  993. }
  994. for _, test := range tests {
  995. o := make(values)
  996. err := parseOpts(test.in, o)
  997. switch {
  998. case err != nil && test.valid:
  999. t.Errorf("%q got unexpected error: %s", test.in, err)
  1000. case err == nil && test.valid && !reflect.DeepEqual(test.expected, o):
  1001. t.Errorf("%q got: %#v want: %#v", test.in, o, test.expected)
  1002. case err == nil && !test.valid:
  1003. t.Errorf("%q expected an error", test.in)
  1004. }
  1005. }
  1006. }
  1007. func TestRuntimeParameters(t *testing.T) {
  1008. type RuntimeTestResult int
  1009. const (
  1010. ResultUnknown RuntimeTestResult = iota
  1011. ResultSuccess
  1012. ResultError // other error
  1013. )
  1014. tests := []struct {
  1015. conninfo string
  1016. param string
  1017. expected string
  1018. expectedOutcome RuntimeTestResult
  1019. }{
  1020. // invalid parameter
  1021. {"DOESNOTEXIST=foo", "", "", ResultError},
  1022. // we can only work with a specific value for these two
  1023. {"client_encoding=SQL_ASCII", "", "", ResultError},
  1024. {"datestyle='ISO, YDM'", "", "", ResultError},
  1025. // "options" should work exactly as it does in libpq
  1026. {"options='-c search_path=pqgotest'", "search_path", "pqgotest", ResultSuccess},
  1027. // pq should override client_encoding in this case
  1028. {"options='-c client_encoding=SQL_ASCII'", "client_encoding", "UTF8", ResultSuccess},
  1029. // allow client_encoding to be set explicitly
  1030. {"client_encoding=UTF8", "client_encoding", "UTF8", ResultSuccess},
  1031. // test a runtime parameter not supported by libpq
  1032. {"work_mem='139kB'", "work_mem", "139kB", ResultSuccess},
  1033. // test fallback_application_name
  1034. {"application_name=foo fallback_application_name=bar", "application_name", "foo", ResultSuccess},
  1035. {"application_name='' fallback_application_name=bar", "application_name", "", ResultSuccess},
  1036. {"fallback_application_name=bar", "application_name", "bar", ResultSuccess},
  1037. }
  1038. for _, test := range tests {
  1039. db, err := openTestConnConninfo(test.conninfo)
  1040. if err != nil {
  1041. t.Fatal(err)
  1042. }
  1043. // application_name didn't exist before 9.0
  1044. if test.param == "application_name" && getServerVersion(t, db) < 90000 {
  1045. db.Close()
  1046. continue
  1047. }
  1048. tryGetParameterValue := func() (value string, outcome RuntimeTestResult) {
  1049. defer db.Close()
  1050. row := db.QueryRow("SELECT current_setting($1)", test.param)
  1051. err = row.Scan(&value)
  1052. if err != nil {
  1053. return "", ResultError
  1054. }
  1055. return value, ResultSuccess
  1056. }
  1057. value, outcome := tryGetParameterValue()
  1058. if outcome != test.expectedOutcome && outcome == ResultError {
  1059. t.Fatalf("%v: unexpected error: %v", test.conninfo, err)
  1060. }
  1061. if outcome != test.expectedOutcome {
  1062. t.Fatalf("unexpected outcome %v (was expecting %v) for conninfo \"%s\"",
  1063. outcome, test.expectedOutcome, test.conninfo)
  1064. }
  1065. if value != test.expected {
  1066. t.Fatalf("bad value for %s: got %s, want %s with conninfo \"%s\"",
  1067. test.param, value, test.expected, test.conninfo)
  1068. }
  1069. }
  1070. }
  1071. func TestIsUTF8(t *testing.T) {
  1072. var cases = []struct {
  1073. name string
  1074. want bool
  1075. }{
  1076. {"unicode", true},
  1077. {"utf-8", true},
  1078. {"utf_8", true},
  1079. {"UTF-8", true},
  1080. {"UTF8", true},
  1081. {"utf8", true},
  1082. {"u n ic_ode", true},
  1083. {"ut_f%8", true},
  1084. {"ubf8", false},
  1085. {"punycode", false},
  1086. }
  1087. for _, test := range cases {
  1088. if g := isUTF8(test.name); g != test.want {
  1089. t.Errorf("isUTF8(%q) = %v want %v", test.name, g, test.want)
  1090. }
  1091. }
  1092. }
  1093. func TestQuoteIdentifier(t *testing.T) {
  1094. var cases = []struct {
  1095. input string
  1096. want string
  1097. }{
  1098. {`foo`, `"foo"`},
  1099. {`foo bar baz`, `"foo bar baz"`},
  1100. {`foo"bar`, `"foo""bar"`},
  1101. {"foo\x00bar", `"foo"`},
  1102. {"\x00foo", `""`},
  1103. }
  1104. for _, test := range cases {
  1105. got := QuoteIdentifier(test.input)
  1106. if got != test.want {
  1107. t.Errorf("QuoteIdentifier(%q) = %v want %v", test.input, got, test.want)
  1108. }
  1109. }
  1110. }