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

Commit9259526

Browse files
committed
When the remote query result has a different number of columns
than the local query specifies (e.g. in the FROM clause),throw an ERROR (instead of crashing). Fix for bug #2129 reportedby Akio Iwaasa.
1 parent71ad8e2 commit9259526

File tree

4 files changed

+40
-19
lines changed

4 files changed

+40
-19
lines changed

‎contrib/dblink/README.dblink

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Darko Prenosil <Darko.Prenosil@finteh.hr>
99
* Shridhar Daithankar <shridhar_daithankar@persistent.co.in>
1010
*
11-
* Copyright (c) 2001-2005, PostgreSQL Global Development Group
11+
* Copyright (c) 2001-2006, PostgreSQL Global Development Group
1212
* ALL RIGHTS RESERVED;
1313
*
1414
* Permission to use, copy, modify, and distribute this software and its

‎contrib/dblink/dblink.c

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Darko Prenosil <Darko.Prenosil@finteh.hr>
99
* Shridhar Daithankar <shridhar_daithankar@persistent.co.in>
1010
*
11-
* Copyright (c) 2001-2005, PostgreSQL Global Development Group
11+
* Copyright (c) 2001-2006, PostgreSQL Global Development Group
1212
* ALL RIGHTS RESERVED;
1313
*
1414
* Permission to use, copy, modify, and distribute this software and its
@@ -579,14 +579,6 @@ dblink_fetch(PG_FUNCTION_ARGS)
579579
/* got results, keep track of them */
580580
funcctx->user_fctx=res;
581581

582-
/* fast track when no results */
583-
if (funcctx->max_calls<1)
584-
{
585-
if (res)
586-
PQclear(res);
587-
SRF_RETURN_DONE(funcctx);
588-
}
589-
590582
/* get a tuple descriptor for our result type */
591583
switch (get_call_result_type(fcinfo,NULL,&tupdesc))
592584
{
@@ -609,6 +601,21 @@ dblink_fetch(PG_FUNCTION_ARGS)
609601
/* make sure we have a persistent copy of the tupdesc */
610602
tupdesc=CreateTupleDescCopy(tupdesc);
611603

604+
/* check result and tuple descriptor have the same number of columns */
605+
if (PQnfields(res)!=tupdesc->natts)
606+
ereport(ERROR,
607+
(errcode(ERRCODE_DATATYPE_MISMATCH),
608+
errmsg("remote query result rowtype does not match "
609+
"the specified FROM clause rowtype")));
610+
611+
/* fast track when no results */
612+
if (funcctx->max_calls<1)
613+
{
614+
if (res)
615+
PQclear(res);
616+
SRF_RETURN_DONE(funcctx);
617+
}
618+
612619
/* store needed metadata for subsequent calls */
613620
attinmeta=TupleDescGetAttInMetadata(tupdesc);
614621
funcctx->attinmeta=attinmeta;
@@ -778,14 +785,6 @@ dblink_record(PG_FUNCTION_ARGS)
778785
if (freeconn)
779786
PQfinish(conn);
780787

781-
/* fast track when no results */
782-
if (funcctx->max_calls<1)
783-
{
784-
if (res)
785-
PQclear(res);
786-
SRF_RETURN_DONE(funcctx);
787-
}
788-
789788
if (!is_sql_cmd)
790789
{
791790
/* get a tuple descriptor for our result type */
@@ -811,6 +810,21 @@ dblink_record(PG_FUNCTION_ARGS)
811810
tupdesc=CreateTupleDescCopy(tupdesc);
812811
}
813812

813+
/* check result and tuple descriptor have the same number of columns */
814+
if (PQnfields(res)!=tupdesc->natts)
815+
ereport(ERROR,
816+
(errcode(ERRCODE_DATATYPE_MISMATCH),
817+
errmsg("remote query result rowtype does not match "
818+
"the specified FROM clause rowtype")));
819+
820+
/* fast track when no results */
821+
if (funcctx->max_calls<1)
822+
{
823+
if (res)
824+
PQclear(res);
825+
SRF_RETURN_DONE(funcctx);
826+
}
827+
814828
/* store needed metadata for subsequent calls */
815829
attinmeta=TupleDescGetAttInMetadata(tupdesc);
816830
funcctx->attinmeta=attinmeta;

‎contrib/dblink/dblink.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Darko Prenosil <Darko.Prenosil@finteh.hr>
99
* Shridhar Daithankar <shridhar_daithankar@persistent.co.in>
1010
*
11-
* Copyright (c) 2001-2005, PostgreSQL Global Development Group
11+
* Copyright (c) 2001-2006, PostgreSQL Global Development Group
1212
* ALL RIGHTS RESERVED;
1313
*
1414
* Permission to use, copy, modify, and distribute this software and its

‎contrib/dblink/doc/cursor

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,13 @@ Outputs
9292

9393
Returns setof record
9494

95+
Note
96+
97+
On a mismatch between the number of return fields as specified in the FROM
98+
clause, and the actual number of fields returned by the remote cursor, an
99+
ERROR will be thrown. In this event, the remote cursor is still advanced
100+
by as many rows as it would have been if the ERROR had not occurred.
101+
95102
Example usage
96103

97104
test=# select dblink_connect('dbname=postgres');

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp