after several times debugging, I 've realized the key point is the order of publication creation and insert statement, and both two have reached catcache.c:SearchCatCacheMiss() .and below has the difference explained
1. publication create first and then insert data into table
the expression ```HeapTupleIsValid(ntp = systable_getnext(scandesc))``` return true
2.insert data into table and then create publication
the expression ```HeapTupleIsValid(ntp = systable_getnext(scandesc))``` return false
so in case 2 , when decoding the first change , system table snapshot do not have Publication 'pub_test' , so throw the error