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

Commit1b37d66

Browse files
author
Maxim Orlov
committed
Fix error on insert from table#32
1 parent4408d5a commit1b37d66

File tree

5 files changed

+151
-18
lines changed

5 files changed

+151
-18
lines changed

‎expected/pg_variables.out‎

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -929,3 +929,59 @@ SELECT * FROM pgv_list() order by package, name;
929929
---------+------+------------------
930930
(0 rows)
931931

932+
-- Check insert of record with various amount of fields
933+
CREATE TEMP TABLE foo(id int, t text);
934+
INSERT INTO foo VALUES (0, 'str00');
935+
SELECT pgv_insert('vars', 'r1', row(1, 'str1'::text, 'str2'::text));
936+
pgv_insert
937+
------------
938+
939+
(1 row)
940+
941+
SELECT pgv_select('vars', 'r1');
942+
pgv_select
943+
---------------
944+
(1,str1,str2)
945+
(1 row)
946+
947+
SELECT pgv_insert('vars', 'r1', foo) FROM foo;
948+
ERROR: new record structure have 2 attributes, but variable "r1" structure have 3.
949+
SELECT pgv_select('vars', 'r1');
950+
pgv_select
951+
---------------
952+
(1,str1,str2)
953+
(1 row)
954+
955+
SELECT pgv_insert('vars', 'r2', row(1, 'str1'));
956+
pgv_insert
957+
------------
958+
959+
(1 row)
960+
961+
SELECT pgv_insert('vars', 'r2', foo) FROM foo;
962+
ERROR: new record attribute type for attribute number 2 differs from variable "r2" structure. You may need explicit type casts.
963+
SELECT pgv_select('vars', 'r2');
964+
pgv_select
965+
------------
966+
(1,str1)
967+
(1 row)
968+
969+
SELECT pgv_insert('vars', 'r3', row(1, 'str1'::text));
970+
pgv_insert
971+
------------
972+
973+
(1 row)
974+
975+
SELECT pgv_insert('vars', 'r3', foo) FROM foo;
976+
pgv_insert
977+
------------
978+
979+
(1 row)
980+
981+
SELECT pgv_select('vars', 'r3');
982+
pgv_select
983+
------------
984+
(1,str1)
985+
(0,str00)
986+
(2 rows)
987+

‎expected/pg_variables_trans.out‎

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3773,3 +3773,59 @@ SELECT pgv_free();
37733773

37743774
(1 row)
37753775

3776+
---
3777+
--- Test case for issue #32 [PGPRO-4456]
3778+
---
3779+
CREATE TEMP TABLE tab (id int, t varchar);
3780+
INSERT INTO tab VALUES (0, 'str00');
3781+
SELECT pgv_insert('vars', 'r1', row(1, 'str1', 'str2'));
3782+
pgv_insert
3783+
------------
3784+
3785+
(1 row)
3786+
3787+
SELECT pgv_insert('vars', 'a', tab) FROM tab;
3788+
pgv_insert
3789+
------------
3790+
3791+
(1 row)
3792+
3793+
SELECT pgv_insert('vars', 'r1', tab) FROM tab;
3794+
ERROR: new record structure have 2 attributes, but variable "r1" structure have 3.
3795+
SELECT pgv_select('vars', 'r1');
3796+
pgv_select
3797+
---------------
3798+
(1,str1,str2)
3799+
(1 row)
3800+
3801+
SELECT pgv_insert('vars', 'r2', row(1, 'str1'::varchar));
3802+
pgv_insert
3803+
------------
3804+
3805+
(1 row)
3806+
3807+
SELECT pgv_insert('vars', 'b', tab) FROM tab;
3808+
pgv_insert
3809+
------------
3810+
3811+
(1 row)
3812+
3813+
SELECT pgv_insert('vars', 'r2', tab) FROM tab;
3814+
pgv_insert
3815+
------------
3816+
3817+
(1 row)
3818+
3819+
SELECT pgv_select('vars', 'r2');
3820+
pgv_select
3821+
------------
3822+
(1,str1)
3823+
(0,str00)
3824+
(2 rows)
3825+
3826+
SELECT pgv_free();
3827+
pgv_free
3828+
----------
3829+
3830+
(1 row)
3831+

‎pg_variables.c‎

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,6 @@ static MemoryContext ModuleContext = NULL;
121121
staticPackage*LastPackage=NULL;
122122
/* Recent variable */
123123
staticVariable*LastVariable=NULL;
124-
/* Recent row type id */
125-
staticOidLastTypeId=InvalidOid;
126124

127125
/* Saved hook values for recall */
128126
staticExecutorEnd_hook_typeprev_ExecutorEnd=NULL;
@@ -706,8 +704,7 @@ variable_insert(PG_FUNCTION_ARGS)
706704
init_record(record,tupdesc,variable);
707705
variable->is_deleted= false;
708706
}
709-
elseif (LastTypeId==RECORDOID|| !OidIsValid(LastTypeId)||
710-
LastTypeId!=tupType)
707+
else
711708
{
712709
/*
713710
* We need to check attributes of the new row if this is a transient
@@ -716,8 +713,6 @@ variable_insert(PG_FUNCTION_ARGS)
716713
check_attributes(variable,tupdesc);
717714
}
718715

719-
LastTypeId=tupType;
720-
721716
insert_record(variable,rec);
722717

723718
/* Release resources */
@@ -742,6 +737,7 @@ variable_update(PG_FUNCTION_ARGS)
742737
boolres;
743738
OidtupType;
744739
int32tupTypmod;
740+
TupleDesctupdesc=NULL;
745741

746742
/* Checks */
747743
CHECK_ARGS_FOR_NULL();
@@ -794,17 +790,9 @@ variable_update(PG_FUNCTION_ARGS)
794790
tupType=HeapTupleHeaderGetTypeId(rec);
795791
tupTypmod=HeapTupleHeaderGetTypMod(rec);
796792

797-
if (LastTypeId==RECORDOID|| !OidIsValid(LastTypeId)||
798-
LastTypeId!=tupType)
799-
{
800-
TupleDesctupdesc=NULL;
801-
802-
tupdesc=lookup_rowtype_tupdesc(tupType,tupTypmod);
803-
check_attributes(variable,tupdesc);
804-
ReleaseTupleDesc(tupdesc);
805-
}
806-
807-
LastTypeId=tupType;
793+
tupdesc=lookup_rowtype_tupdesc(tupType,tupTypmod);
794+
check_attributes(variable,tupdesc);
795+
ReleaseTupleDesc(tupdesc);
808796

809797
res=update_record(variable,rec);
810798

@@ -1330,7 +1318,6 @@ resetVariablesCache(void)
13301318
/* Remove package and variable from cache */
13311319
LastPackage=NULL;
13321320
LastVariable=NULL;
1333-
LastTypeId=InvalidOid;
13341321
}
13351322

13361323
/*

‎sql/pg_variables.sql‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,3 +259,19 @@ SELECT pgv_free();
259259
SELECT pgv_exists('vars');
260260

261261
SELECT*FROM pgv_list()order by package, name;
262+
-- Check insert of record with various amount of fields
263+
CREATE TEMP TABLE foo(idint, ttext);
264+
INSERT INTO fooVALUES (0,'str00');
265+
266+
SELECT pgv_insert('vars','r1', row(1,'str1'::text,'str2'::text));
267+
SELECT pgv_select('vars','r1');
268+
SELECT pgv_insert('vars','r1', foo)FROM foo;
269+
SELECT pgv_select('vars','r1');
270+
271+
SELECT pgv_insert('vars','r2', row(1,'str1'));
272+
SELECT pgv_insert('vars','r2', foo)FROM foo;
273+
SELECT pgv_select('vars','r2');
274+
275+
SELECT pgv_insert('vars','r3', row(1,'str1'::text));
276+
SELECT pgv_insert('vars','r3', foo)FROM foo;
277+
SELECT pgv_select('vars','r3');

‎sql/pg_variables_trans.sql‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,3 +1145,21 @@ COMMIT;
11451145

11461146
DROPVIEW pgv_stats_view;
11471147
SELECT pgv_free();
1148+
1149+
---
1150+
--- Test case for issue #32 [PGPRO-4456]
1151+
---
1152+
CREATE TEMP TABLE tab (idint, tvarchar);
1153+
INSERT INTO tabVALUES (0,'str00');
1154+
1155+
SELECT pgv_insert('vars','r1', row(1,'str1','str2'));
1156+
SELECT pgv_insert('vars','a', tab)FROM tab;
1157+
SELECT pgv_insert('vars','r1', tab)FROM tab;
1158+
SELECT pgv_select('vars','r1');
1159+
1160+
SELECT pgv_insert('vars','r2', row(1,'str1'::varchar));
1161+
SELECT pgv_insert('vars','b', tab)FROM tab;
1162+
SELECT pgv_insert('vars','r2', tab)FROM tab;
1163+
SELECT pgv_select('vars','r2');
1164+
1165+
SELECT pgv_free();

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp