@@ -9,6 +9,8 @@ PG_FUNCTION_INFO_V1(smoc_out);
99PG_FUNCTION_INFO_V1 (moc_debug );
1010PG_FUNCTION_INFO_V1 (set_smoc_output_type );
1111PG_FUNCTION_INFO_V1 (smoc_order );
12+ PG_FUNCTION_INFO_V1 (smoc_eq );
13+ PG_FUNCTION_INFO_V1 (smoc_neq );
1214
1315PG_FUNCTION_INFO_V1 (healpix_subset_smoc );
1416PG_FUNCTION_INFO_V1 (healpix_not_subset_smoc );
@@ -413,6 +415,55 @@ moc_debug(PG_FUNCTION_ARGS)
413415 PG_RETURN_TEXT_P (cstring_to_text (x ));
414416}
415417
418+ static bool
419+ smoc_eq_impl (Smoc * moc_a , Smoc * moc_b )
420+ {
421+ int32 a = moc_a -> data_begin ;
422+ int32 b = moc_b -> data_begin ;
423+ int32 entry_size = MOC_INTERVAL_SIZE ;
424+ int32 moc_a_end = VARSIZE (moc_a ) - VARHDRSZ ;
425+ int32 moc_b_end = VARSIZE (moc_b ) - VARHDRSZ ;
426+ char * moc_a_base = MOC_BASE (moc_a );
427+ char * moc_b_base = MOC_BASE (moc_b );
428+
429+ 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 */
430+ return false;
431+
432+ 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 )
433+ return false;
434+
435+ for (int j = moc_a -> data_begin ; j < moc_a_end ; j += entry_size ) // iterate over both in parallel
436+ {
437+ // page bumps
438+ int32 mod = (j + entry_size ) % PG_TOAST_PAGE_FRAGMENT ;
439+ if (mod > 0 && mod < entry_size )
440+ j += entry_size - mod ;
441+ moc_interval * x = MOC_INTERVAL (moc_a_base , j );
442+ moc_interval * y = MOC_INTERVAL (moc_b_base , j );
443+
444+ if (x -> first != y -> first || x -> second != y -> second )
445+ return false;
446+ }
447+
448+ return true;
449+ }
450+
451+ Datum
452+ smoc_eq (PG_FUNCTION_ARGS )
453+ {
454+ Smoc * moc_a = (Smoc * ) PG_DETOAST_DATUM (PG_GETARG_DATUM (0 ));
455+ Smoc * moc_b = (Smoc * ) PG_DETOAST_DATUM (PG_GETARG_DATUM (1 ));
456+ PG_RETURN_BOOL (smoc_eq_impl (moc_a , moc_b ));
457+ }
458+
459+ Datum
460+ smoc_neq (PG_FUNCTION_ARGS )
461+ {
462+ Smoc * moc_a = (Smoc * ) PG_DETOAST_DATUM (PG_GETARG_DATUM (0 ));
463+ Smoc * moc_b = (Smoc * ) PG_DETOAST_DATUM (PG_GETARG_DATUM (1 ));
464+ PG_RETURN_BOOL (! smoc_eq_impl (moc_a , moc_b ));
465+ }
466+
416467static bool
417468entry_equal (moc_tree_entry * a , hpint64 y )
418469{
0 commit comments