@@ -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 ,
5454text * name ,Oid typid ,
55- bool strict );
55+ bool strict , bool type_strict );
5656static Variable * createVariableInternal (Package * package ,
5757text * name ,Oid typid ,
5858bool is_transactional );
@@ -197,7 +197,7 @@ variable_get(text *package_name, text *var_name,
197197return 0 ;
198198}
199199
200- variable = getVariableInternal (package ,var_name ,typid ,strict );
200+ variable = getVariableInternal (package ,var_name ,typid ,strict , true );
201201
202202if (variable == NULL )
203203{
@@ -455,7 +455,7 @@ variable_update(PG_FUNCTION_ARGS)
455455strncmp (VARDATA_ANY (var_name ),GetName (LastVariable ),
456456VARSIZE_ANY_EXHDR (var_name ))!= 0 )
457457{
458- variable = getVariableInternal (package ,var_name ,RECORDOID , true);
458+ variable = getVariableInternal (package ,var_name ,RECORDOID , true, true );
459459LastVariable = variable ;
460460}
461461else
@@ -543,7 +543,7 @@ variable_delete(PG_FUNCTION_ARGS)
543543strncmp (VARDATA_ANY (var_name ),GetName (LastVariable ),
544544VARSIZE_ANY_EXHDR (var_name ))!= 0 )
545545{
546- variable = getVariableInternal (package ,var_name ,RECORDOID , true);
546+ variable = getVariableInternal (package ,var_name ,RECORDOID , true, true );
547547LastVariable = variable ;
548548}
549549else
@@ -592,7 +592,7 @@ variable_select(PG_FUNCTION_ARGS)
592592var_name = PG_GETARG_TEXT_PP (1 );
593593
594594package = getPackageByName (package_name , false, true);
595- variable = getVariableInternal (package ,var_name ,RECORDOID , true);
595+ variable = getVariableInternal (package ,var_name ,RECORDOID , true, true );
596596
597597record = & (GetActualValue (variable ).record );
598598
@@ -667,7 +667,7 @@ variable_select_by_value(PG_FUNCTION_ARGS)
667667}
668668
669669package = getPackageByName (package_name , false, true);
670- variable = getVariableInternal (package ,var_name ,RECORDOID , true);
670+ variable = getVariableInternal (package ,var_name ,RECORDOID , true, true );
671671
672672if (!value_is_null )
673673check_record_key (variable ,value_type );
@@ -736,7 +736,7 @@ variable_select_by_values(PG_FUNCTION_ARGS)
736736var_name = PG_GETARG_TEXT_PP (1 );
737737
738738package = getPackageByName (package_name , false, true);
739- variable = getVariableInternal (package ,var_name ,RECORDOID , true);
739+ variable = getVariableInternal (package ,var_name ,RECORDOID , true, true );
740740
741741check_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
868867CHECK_ARGS_FOR_NULL ();
869868
870869package_name = PG_GETARG_TEXT_PP (0 );
871870var_name = PG_GETARG_TEXT_PP (1 );
872871
873872package = 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+ {
898885if (!isObjectChangedInCurrentTrans (transObject ))
899886{
900887createSavepoint (transObject ,TRANS_VARIABLE );
901888addToChangesStack (transObject ,TRANS_VARIABLE );
902889}
903890GetActualState (variable )-> is_valid = false;
904891}
892+ else
893+ removeObject (& variable -> transObject ,TRANS_VARIABLE );
905894
906895resetVariablesCache (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{
14541444Variable * variable ;
14551445char key [NAMEDATALEN ];
@@ -1466,7 +1456,7 @@ getVariableInternal(Package *package, text *name, Oid typid, bool strict)
14661456/* Check variable type */
14671457if (found )
14681458{
1469- if (variable -> typid != typid )
1459+ if (type_strict && variable -> typid != typid )
14701460{
14711461char * var_type = DatumGetCString (DirectFunctionCall1 (regtypeout ,
14721462ObjectIdGetDatum (variable -> typid )));
@@ -1574,6 +1564,12 @@ createVariableInternal(Package *package, text *name, Oid typid,
15741564& scalar -> typbyval );
15751565varState -> 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
15791575GetActualState (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 ))
16791675removeFromChangesStack (object ,type );
16801676if (type == TRANS_PACKAGE )
16811677{