C Function Definition - Advanced SQL Engine - Teradata Database

SQL External Routine Programming

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
June 2020
Language
English (United States)
Last Update
2021-01-24
dita:mapPath
qwr1571437338192.ditamap
dita:ditavalPath
lze1555437562152.ditaval
dita:id
B035-1147
lifecycle
previous
Product Category
Teradata Vantage™
#define SQL_TEXT Latin_Text
#include <sqltypes_td.h>
#include <string.h>

/* Aggregate storage area */
typedef struct arg_storage {
   CHARACTER ConcatOfColumn[20000] ;
   } AgrStorage ;

void udf_agch002002udt(FNC_Phase      phase,
                       FNC_Context_t *fContext,
                       UDT_HANDLE    *ColumnValueUdt,
                       UDT_HANDLE    *resultUdt,
                       int           *ColumnValueUdtIndicator,
                       int           *ResultUdtIndicator,
                       char           sqlstate[6],
                       SQL_TEXT       ExternalName[129],
                       SQL_TEXT       SpecificName[129],
                       SQL_TEXT       ErrorMsg[257])
{
   char ColumnValue[20000]; // Buffer to hold retrieved column value
   int length;              // Length of retrieved value
   char result[20000];
   AgrStorage *s1 = fContext->interim1 ; // Pointers to intermediate
   AgrStorage *s2 = fContext->interim2 ; //   storage areas

   /* Switch to determine aggregation phase */
   switch (phase)
      {
      case AGR_INIT:
         /* Allocate and initialize the intermediate storage */
         if ((s1 = FNC_DefMem(sizeof(AgrStorage))) == NULL) {
            strcpy((char *)sqlstate, "U09999") ;
            strcpy((char *)ErrorMsg,"Memory allocation failure");
            return;
         }
         strcpy((char*)s1->ConcatOfColumn, "INIT");   
         strcpy((char *)sqlstate, "00000");
         *ResultUdtIndicator = -1;
         /* Drop through to first row data */
      case AGR_DETAIL:
         if (*ColumnValueUdtIndicator != -1) { // if not NULL
            FNC_GetDistinctValue(*ColumnValueUdt, &ColumnValue,
                                 sizeof(ColumnValue), &length);
            /* Concatenate values */
            strcat((char*)s1->ConcatOfColumn,(char *)ColumnValue);
         }
         *ResultUdtIndicator = -1;
         break ;
      case AGR_COMBINE:
         /* Aggregate groups. */
         strcat((char*)s1->ConcatOfColumn,(char*)s2->ConcatOfColumn);
         *ResultUdtIndicator = -1;
         break ;
      case AGR_FINAL:
         /* Produce the final result */
         strcat((char*)s1->ConcatOfColumn, "FINAL");
         strcpy((char *)result,(char*)s1->ConcatOfColumn);
         FNC_SetDistinctValue(*resultUdt,&result,
                              sizeof(s1->ConcatOfColumn));
         *ResultUdtIndicator = 0;
         break;
      case AGR_NODATA:				// Set indicator to NULL
         *ResultUdtIndicator = -1 ;
         break ;
      default:
         strcpy (sqlstate, "U0005") ;
   }
   return ;
}