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

Commit51f3ace

Browse files
CherkashinSergeyza-arthur
authored andcommitted
Fix adding package to changes list after last variable removal
1 parente9d74c4 commit51f3ace

File tree

3 files changed

+67
-36
lines changed

3 files changed

+67
-36
lines changed

‎expected/pg_variables.out‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,32 @@ SELECT pgv_select('vars3', 'r1') LIMIT 2 OFFSET 2;
672672
(0,str00)
673673
(1 row)
674674

675+
-- Clean memory after unsuccessful creation of a variable
676+
SELECT pgv_insert('vars4', 'r1', row('str1', 'str1'));
677+
ERROR: could not identify a hash function for type unknown
678+
SELECT package FROM pgv_stats() WHERE package = 'vars4';
679+
package
680+
---------
681+
(0 rows)
682+
683+
-- Remove package if it is empty
684+
SELECT pgv_insert('vars4', 'r2', row(1, 'str1', 'str2'));
685+
pgv_insert
686+
------------
687+
688+
(1 row)
689+
690+
SELECT pgv_remove('vars4', 'r2');
691+
pgv_remove
692+
------------
693+
694+
(1 row)
695+
696+
SELECT package FROM pgv_stats() WHERE package = 'vars4';
697+
package
698+
---------
699+
(0 rows)
700+
675701
-- Manipulate variables
676702
SELECT * FROM pgv_list() order by package, name;
677703
package | name | is_transactional

‎pg_variables.c‎

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ static void getKeyFromName(text *name, char *key);
5252
staticPackage*getPackageByName(text*name,boolcreate,boolstrict);
5353
staticVariable*getVariableInternal(Package*package,
5454
text*name,Oidtypid,
55-
boolstrict);
55+
boolstrict,booltype_strict);
5656
staticVariable*createVariableInternal(Package*package,
5757
text*name,Oidtypid,
5858
boolis_transactional);
@@ -197,7 +197,7 @@ variable_get(text *package_name, text *var_name,
197197
return0;
198198
}
199199

200-
variable=getVariableInternal(package,var_name,typid,strict);
200+
variable=getVariableInternal(package,var_name,typid,strict, true);
201201

202202
if (variable==NULL)
203203
{
@@ -455,7 +455,7 @@ variable_update(PG_FUNCTION_ARGS)
455455
strncmp(VARDATA_ANY(var_name),GetName(LastVariable),
456456
VARSIZE_ANY_EXHDR(var_name))!=0)
457457
{
458-
variable=getVariableInternal(package,var_name,RECORDOID, true);
458+
variable=getVariableInternal(package,var_name,RECORDOID, true, true);
459459
LastVariable=variable;
460460
}
461461
else
@@ -543,7 +543,7 @@ variable_delete(PG_FUNCTION_ARGS)
543543
strncmp(VARDATA_ANY(var_name),GetName(LastVariable),
544544
VARSIZE_ANY_EXHDR(var_name))!=0)
545545
{
546-
variable=getVariableInternal(package,var_name,RECORDOID, true);
546+
variable=getVariableInternal(package,var_name,RECORDOID, true, true);
547547
LastVariable=variable;
548548
}
549549
else
@@ -592,7 +592,7 @@ variable_select(PG_FUNCTION_ARGS)
592592
var_name=PG_GETARG_TEXT_PP(1);
593593

594594
package=getPackageByName(package_name, false, true);
595-
variable=getVariableInternal(package,var_name,RECORDOID, true);
595+
variable=getVariableInternal(package,var_name,RECORDOID, true, true);
596596

597597
record=&(GetActualValue(variable).record);
598598

@@ -667,7 +667,7 @@ variable_select_by_value(PG_FUNCTION_ARGS)
667667
}
668668

669669
package=getPackageByName(package_name, false, true);
670-
variable=getVariableInternal(package,var_name,RECORDOID, true);
670+
variable=getVariableInternal(package,var_name,RECORDOID, true, true);
671671

672672
if (!value_is_null)
673673
check_record_key(variable,value_type);
@@ -736,7 +736,7 @@ variable_select_by_values(PG_FUNCTION_ARGS)
736736
var_name=PG_GETARG_TEXT_PP(1);
737737

738738
package=getPackageByName(package_name, false, true);
739-
variable=getVariableInternal(package,var_name,RECORDOID, true);
739+
variable=getVariableInternal(package,var_name,RECORDOID, true, true);
740740

741741
check_record_key(variable,ARR_ELEMTYPE(values));
742742

@@ -858,50 +858,39 @@ package_exists(PG_FUNCTION_ARGS)
858858
Datum
859859
remove_variable(PG_FUNCTION_ARGS)
860860
{
861-
text*package_name;
862-
text*var_name;
863-
Package*package;
864-
Variable*variable;
865-
boolfound;
866-
charkey[NAMEDATALEN];
861+
text*package_name;
862+
text*var_name;
863+
Package*package;
864+
Variable*variable;
865+
TransObject*transObject;
867866

868867
CHECK_ARGS_FOR_NULL();
869868

870869
package_name=PG_GETARG_TEXT_PP(0);
871870
var_name=PG_GETARG_TEXT_PP(1);
872871

873872
package=getPackageByName(package_name, false, true);
874-
getKeyFromName(var_name,key);
873+
variable=getVariableInternal(package,var_name,0, true, false);
875874

876-
variable= (Variable*)hash_search(package->varHashRegular,
877-
key,HASH_REMOVE,&found);
878-
if (found)
875+
/* Add package to changes list, so we can remove it if it */
876+
if (!isObjectChangedInCurrentTrans(&package->transObject))
879877
{
880-
/* Regular variable */
881-
removeState(&variable->transObject,TRANS_VARIABLE,
882-
GetActualState(variable));
878+
createSavepoint(&package->transObject,TRANS_PACKAGE);
879+
addToChangesStack(&package->transObject,TRANS_PACKAGE);
883880
}
884-
else
885-
{
886-
TransObject*transObject;
887881

888-
variable= (Variable*)hash_search(package->varHashTransact,
889-
key,HASH_FIND,&found);
890-
/* Variable doesn't exist in both HTAB */
891-
if (!found)
892-
ereport(ERROR,
893-
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
894-
errmsg("unrecognized variable \"%s\"",key)));
895-
896-
/* Transactional variable */
897-
transObject=&variable->transObject;
882+
transObject=&variable->transObject;
883+
if (variable->is_transactional)
884+
{
898885
if (!isObjectChangedInCurrentTrans(transObject))
899886
{
900887
createSavepoint(transObject,TRANS_VARIABLE);
901888
addToChangesStack(transObject,TRANS_VARIABLE);
902889
}
903890
GetActualState(variable)->is_valid= false;
904891
}
892+
else
893+
removeObject(&variable->transObject,TRANS_VARIABLE);
905894

906895
resetVariablesCache(false);
907896

@@ -1449,7 +1438,8 @@ getPackageByName(text *name, bool create, bool strict)
14491438
* flag 'is_transactional' of this variable is unknown.
14501439
*/
14511440
staticVariable*
1452-
getVariableInternal(Package*package,text*name,Oidtypid,boolstrict)
1441+
getVariableInternal(Package*package,text*name,Oidtypid,boolstrict,
1442+
booltype_strict)
14531443
{
14541444
Variable*variable;
14551445
charkey[NAMEDATALEN];
@@ -1466,7 +1456,7 @@ getVariableInternal(Package *package, text *name, Oid typid, bool strict)
14661456
/* Check variable type */
14671457
if (found)
14681458
{
1469-
if (variable->typid!=typid)
1459+
if (type_strict&&variable->typid!=typid)
14701460
{
14711461
char*var_type=DatumGetCString(DirectFunctionCall1(regtypeout,
14721462
ObjectIdGetDatum(variable->typid)));
@@ -1574,6 +1564,12 @@ createVariableInternal(Package *package, text *name, Oid typid,
15741564
&scalar->typbyval);
15751565
varState->value.scalar.is_null= true;
15761566
}
1567+
1568+
if (!isObjectChangedInCurrentTrans(&package->transObject))
1569+
{
1570+
createSavepoint(&package->transObject,TRANS_PACKAGE);
1571+
addToChangesStack(&package->transObject,TRANS_PACKAGE);
1572+
}
15771573
}
15781574

15791575
GetActualState(variable)->is_valid= true;
@@ -1675,7 +1671,7 @@ removeObject(TransObject *object, TransObjectType type)
16751671
* Delete an object from the change history of the overlying
16761672
* transaction level (head of 'changesStack' at this point).
16771673
*/
1678-
if (!dlist_is_empty(changesStack))
1674+
if (changesStack&&!dlist_is_empty(changesStack))
16791675
removeFromChangesStack(object,type);
16801676
if (type==TRANS_PACKAGE)
16811677
{

‎sql/pg_variables.sql‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,15 @@ SELECT pgv_select('vars3', 'r1', 1);
183183
SELECT pgv_select('vars3','r1')LIMIT2;
184184
SELECT pgv_select('vars3','r1')LIMIT2 OFFSET2;
185185

186+
-- Clean memory after unsuccessful creation of a variable
187+
SELECT pgv_insert('vars4','r1', row('str1','str1'));
188+
SELECT packageFROM pgv_stats()WHERE package='vars4';
189+
190+
-- Remove package if it is empty
191+
SELECT pgv_insert('vars4','r2', row(1,'str1','str2'));
192+
SELECT pgv_remove('vars4','r2');
193+
SELECT packageFROM pgv_stats()WHERE package='vars4';
194+
186195
-- Manipulate variables
187196
SELECT*FROM pgv_list()order by package, name;
188197
SELECT packageFROM pgv_stats()order by package;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp