@@ -52,7 +52,7 @@ static void getKeyFromName(text *name, char *key);
5252static Package * getPackageByName (text * name , bool create , bool strict );
5353static Variable * getVariableInternal (Package * package ,
5454 text * name , Oid typid ,
55- bool strict );
55+ bool strict , bool type_strict );
5656static Variable * createVariableInternal (Package * package ,
5757 text * name , Oid typid ,
5858 bool is_transactional );
@@ -197,7 +197,7 @@ variable_get(text *package_name, text *var_name,
197197 return 0 ;
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)
858858Datum
859859remove_variable (PG_FUNCTION_ARGS )
860860{
861- text * package_name ;
862- text * var_name ;
863- Package * package ;
864- Variable * variable ;
865- bool found ;
866- char key [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 */
14511440static Variable *
1452- getVariableInternal (Package * package , text * name , Oid typid , bool strict )
1441+ getVariableInternal (Package * package , text * name , Oid typid , bool strict ,
1442+ bool type_strict )
14531443{
14541444 Variable * variable ;
14551445 char key [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 {
0 commit comments