/* function context area */ typedef struct arg_storage { int MaxOfColumn ; } AgrStorage ; void AggFncWAnytype( FNC_Phase phase, FNC_Context_t *fContext, void *input, INTEGER *result, int *inputIsNull, int *resultIsNull, char sqlstate[6], SQL_TEXT extname[129], SQL_TEXT specific_name[129], SQL_TEXT error_message[257] ) { int sumValue = 0; anytype_param_info_t paraminfo; int numAnyType; AgrStorage *s1 = fContext->interim1 ; AgrStorage *s2 = fContext->interim2 ; switch (phase) { case AGR_INIT: /* Allocate and initialize the intermediate storage. */ if ((s1 = FNC_DefMem(sizeof(AgrStorage))) == NULL) { strcpy((char *)sqlstate, "U09999") ; strcpy((char *)&(error_message[0]),"Memory allocation failure"); return; } s1->MaxOfColumn = 0; strcpy((char *)sqlstate, "00000"); memset(&(error_message[0]), 0, sizeof(error_message)); case AGR_DETAIL: FNC_GetAnyTypeParamInfo( sizeof(anytype_param_info_t), &numAnyType, ¶minfo); /* Process the value based upon the data type. */ switch(paraminfo.datatype) { case BYTEINT_DT: case SMALLINT_DT: case INTEGER_DT: /* Process the value */ s1->MaxOfColumn = 10; break; case VARCHAR_DT: case CHAR_DT: s1->MaxOfColumn = 11; break; case CLOB_REFERENCE_DT: s1->MaxOfColumn = 12; break; default: /* Invalid string */ strcpy((char *)sqlstate, "22023"); sprintf((char*)error_message, "\n Invalid Data Type passed into UDF"); break; } /* end of the switch statement */ break; case AGR_COMBINE: /* combine the intermediate results */ if(s1->MaxOfColumn < s2->MaxOfColumn) s1->MaxOfColumn =s2->MaxOfColumn; break; case AGR_FINAL: /* produce the final result */ *result = s1->MaxOfColumn; break; case AGR_NODATA: /* No data passed in ... so nothing to do */ //Indicate that OUTPUT is being produced. *resultIsNull =IsNull; break; default: strcpy (sqlstate, "U0005") ; sprintf((char*)error_message,"\n Unknown Aggregate Phase!"); return; } }