@@ -433,17 +433,31 @@ moc_debug(PG_FUNCTION_ARGS)
433433}
434434
435435static bool
436- smoc_eq_impl (Smoc * moc_a , Smoc * moc_b )
436+ smoc_eq_impl (Datum a , Datum b )
437437{
438- int32 moc_a_end = VARSIZE (moc_a )- VARHDRSZ ;
439- int32 moc_b_end = VARSIZE (moc_b )- VARHDRSZ ;
440- char * moc_a_base = MOC_BASE (moc_a );
441- char * moc_b_base = MOC_BASE (moc_b );
438+ Smoc * moc_a = (Smoc * )PG_DETOAST_DATUM_SLICE (a ,0 ,MOC_HEADER_PAGE );
439+ Smoc * moc_b = (Smoc * )PG_DETOAST_DATUM_SLICE (b ,0 ,MOC_HEADER_PAGE );
440+ int32 moc_a_end ;
441+ int32 moc_b_end ;
442+ char * moc_a_base ;
443+ char * moc_b_base ;
442444
443- if (moc_a -> data_begin != moc_b -> data_begin || moc_a_end != moc_b_end )/* this needs to be reconsidered if the MOC version is updated */
445+ /* quick exit if header values don't agree */
446+ if (moc_a -> order != moc_b -> order || moc_a -> first != moc_b -> first || moc_a -> last != moc_b -> last || moc_a -> area != moc_b -> area )
447+ return false;
448+ if (moc_a -> data_begin != moc_b -> data_begin )/* this needs to be reconsidered if the MOC version is updated */
444449return false;
445450
446- if (moc_a -> order != moc_b -> order || moc_a -> first != moc_b -> first || moc_a -> last != moc_b -> last || moc_a -> area != moc_b -> area )
451+ /* get full moc */
452+ moc_a = (Smoc * )PG_DETOAST_DATUM (a );
453+ moc_b = (Smoc * )PG_DETOAST_DATUM (b );
454+
455+ moc_a_end = VARSIZE (moc_a )- VARHDRSZ ;
456+ moc_b_end = VARSIZE (moc_b )- VARHDRSZ ;
457+ moc_a_base = MOC_BASE (moc_a );
458+ moc_b_base = MOC_BASE (moc_b );
459+
460+ if (moc_a_end != moc_b_end )/* this needs to be reconsidered if the MOC version is updated */
447461return false;
448462
449463for (int j = moc_a -> data_begin ;j < moc_a_end ;j += MOC_INTERVAL_SIZE )// iterate over both in parallel
@@ -467,17 +481,17 @@ smoc_eq_impl(Smoc* moc_a, Smoc* moc_b)
467481Datum
468482smoc_eq (PG_FUNCTION_ARGS )
469483{
470- Smoc * moc_a = ( Smoc * ) PG_DETOAST_DATUM ( PG_GETARG_DATUM (0 ) );
471- Smoc * moc_b = ( Smoc * ) PG_DETOAST_DATUM ( PG_GETARG_DATUM (1 ) );
472- PG_RETURN_BOOL (smoc_eq_impl (moc_a , moc_b ));
484+ Datum a = PG_GETARG_DATUM (0 );
485+ Datum b = PG_GETARG_DATUM (1 );
486+ PG_RETURN_BOOL (smoc_eq_impl (a , b ));
473487}
474488
475489Datum
476490smoc_neq (PG_FUNCTION_ARGS )
477491{
478- Smoc * moc_a = ( Smoc * ) PG_DETOAST_DATUM ( PG_GETARG_DATUM (0 ) );
479- Smoc * moc_b = ( Smoc * ) PG_DETOAST_DATUM ( PG_GETARG_DATUM (1 ) );
480- PG_RETURN_BOOL (!smoc_eq_impl (moc_a , moc_b ));
492+ Datum a = PG_GETARG_DATUM (0 );
493+ Datum b = PG_GETARG_DATUM (1 );
494+ PG_RETURN_BOOL (!smoc_eq_impl (a , b ));
481495}
482496
483497static bool