Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb8af416

Browse files
committed
libpq: Reset singlerow flag correctly in pipeline mode
When a query whose results were requested in single-row mode is the lastin the queue by the time those results are being read, the single-rowflag was not being reset, because we were returning early frompqPipelineProcessQueue. Move that stanza up so that the flag is alwaysreset at the end of sending that query's results.Add a test for the situation.Backpatch to 14.Author: Denis Laxalde <denis.laxalde@dalibo.com>Discussion:https://postgr.es/m/01af18c5-dacc-a8c8-07ee-aecc7650c3e8@dalibo.com
1 parent3fe6f26 commitb8af416

File tree

3 files changed

+70
-7
lines changed

3 files changed

+70
-7
lines changed

‎src/interfaces/libpq/fe-exec.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3088,6 +3088,12 @@ pqPipelineProcessQueue(PGconn *conn)
30883088
break;
30893089
}
30903090

3091+
/*
3092+
* Reset single-row processing mode. (Client has to set it up for each
3093+
* query, if desired.)
3094+
*/
3095+
conn->singleRowMode= false;
3096+
30913097
/*
30923098
* If there are no further commands to process in the queue, get us in
30933099
* "real idle" mode now.
@@ -3101,12 +3107,6 @@ pqPipelineProcessQueue(PGconn *conn)
31013107
/* Initialize async result-accumulation state */
31023108
pqClearAsyncResult(conn);
31033109

3104-
/*
3105-
* Reset single-row processing mode. (Client has to set it up for each
3106-
* query, if desired.)
3107-
*/
3108-
conn->singleRowMode= false;
3109-
31103110
if (conn->pipelineStatus==PQ_PIPELINE_ABORTED&&
31113111
conn->cmd_queue_head->queryclass!=PGQUERY_SYNC)
31123112
{

‎src/test/modules/libpq_pipeline/libpq_pipeline.c

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1143,11 +1143,11 @@ test_singlerowmode(PGconn *conn)
11431143
inti;
11441144
boolpipeline_ended= false;
11451145

1146-
/* 1 pipeline, 3 queries in it */
11471146
if (PQenterPipelineMode(conn)!=1)
11481147
pg_fatal("failed to enter pipeline mode: %s",
11491148
PQerrorMessage(conn));
11501149

1150+
/* One series of three commands, using single-row mode for the first two. */
11511151
for (i=0;i<3;i++)
11521152
{
11531153
char*param[1];
@@ -1239,6 +1239,49 @@ test_singlerowmode(PGconn *conn)
12391239
pg_fatal("didn't get expected terminating TUPLES_OK");
12401240
}
12411241

1242+
/*
1243+
* Now issue one command, get its results in with single-row mode, then
1244+
* issue another command, and get its results in normal mode; make sure
1245+
* the single-row mode flag is reset as expected.
1246+
*/
1247+
if (PQsendQueryParams(conn,"SELECT generate_series(0, 0)",
1248+
0,NULL,NULL,NULL,NULL,0)!=1)
1249+
pg_fatal("failed to send query: %s",
1250+
PQerrorMessage(conn));
1251+
if (PQsendFlushRequest(conn)!=1)
1252+
pg_fatal("failed to send flush request");
1253+
if (PQsetSingleRowMode(conn)!=1)
1254+
pg_fatal("PQsetSingleRowMode() failed");
1255+
res=PQgetResult(conn);
1256+
if (res==NULL)
1257+
pg_fatal("unexpected NULL");
1258+
if (PQresultStatus(res)!=PGRES_SINGLE_TUPLE)
1259+
pg_fatal("Expected PGRES_SINGLE_TUPLE, got %s",
1260+
PQresStatus(PQresultStatus(res)));
1261+
res=PQgetResult(conn);
1262+
if (res==NULL)
1263+
pg_fatal("unexpected NULL");
1264+
if (PQresultStatus(res)!=PGRES_TUPLES_OK)
1265+
pg_fatal("Expected PGRES_TUPLES_OK, got %s",
1266+
PQresStatus(PQresultStatus(res)));
1267+
if (PQgetResult(conn)!=NULL)
1268+
pg_fatal("expected NULL result");
1269+
1270+
if (PQsendQueryParams(conn,"SELECT 1",
1271+
0,NULL,NULL,NULL,NULL,0)!=1)
1272+
pg_fatal("failed to send query: %s",
1273+
PQerrorMessage(conn));
1274+
if (PQsendFlushRequest(conn)!=1)
1275+
pg_fatal("failed to send flush request");
1276+
res=PQgetResult(conn);
1277+
if (res==NULL)
1278+
pg_fatal("unexpected NULL");
1279+
if (PQresultStatus(res)!=PGRES_TUPLES_OK)
1280+
pg_fatal("Expected PGRES_TUPLES_OK, got %s",
1281+
PQresStatus(PQresultStatus(res)));
1282+
if (PQgetResult(conn)!=NULL)
1283+
pg_fatal("expected NULL result");
1284+
12421285
if (PQexitPipelineMode(conn)!=1)
12431286
pg_fatal("failed to end pipeline mode: %s",PQerrorMessage(conn));
12441287

‎src/test/modules/libpq_pipeline/traces/singlerow.trace

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,24 @@ B12DataRow 1 2 '45'
3636
B12DataRow 1 2 '46'
3737
B13CommandComplete "SELECT 5"
3838
B5ReadyForQuery I
39+
F36Parse "" "SELECT generate_series(0, 0)" 0
40+
F14Bind "" "" 0 0 1 0
41+
F6Describe P ""
42+
F9Execute "" 0
43+
F4Flush
44+
B4ParseComplete
45+
B4BindComplete
46+
B40RowDescription 1 "generate_series" NNNN 0 NNNN 4 -1 0
47+
B11DataRow 1 1 '0'
48+
B13CommandComplete "SELECT 1"
49+
F16Parse "" "SELECT 1" 0
50+
F14Bind "" "" 0 0 1 0
51+
F6Describe P ""
52+
F9Execute "" 0
53+
F4Flush
54+
B4ParseComplete
55+
B4BindComplete
56+
B33RowDescription 1 "?column?" NNNN 0 NNNN 4 -1 0
57+
B11DataRow 1 1 '1'
58+
B13CommandComplete "SELECT 1"
3959
F4Terminate

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp