Datum charge(PG_FUNCTION_ARGS) { char arg1 = PG_GETARG_CHAR(0); char arg2 = PG_GETARG_CHAR(1); PG_RETURN_BOOL((uint8) arg1 >= (uint8) arg2); }
Datum chareq(PG_FUNCTION_ARGS) { char arg1 = PG_GETARG_CHAR(0); char arg2 = PG_GETARG_CHAR(1); PG_RETURN_BOOL(arg1 == arg2); }
Datum charmul(PG_FUNCTION_ARGS) { char arg1 = PG_GETARG_CHAR(0); char arg2 = PG_GETARG_CHAR(1); PG_RETURN_CHAR((int8) arg1 * (int8) arg2); }
Datum bmcharcmp(PG_FUNCTION_ARGS) { char a = PG_GETARG_CHAR(0); char b = PG_GETARG_CHAR(1); /* Be careful to compare chars as unsigned */ PG_RETURN_INT32((int32) ((uint8) a) - (int32) ((uint8) b)); }
Datum chardiv(PG_FUNCTION_ARGS) { char arg1 = PG_GETARG_CHAR(0); char arg2 = PG_GETARG_CHAR(1); if (arg2 == 0) ereport(ERROR, (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); PG_RETURN_CHAR((int8) arg1 / (int8) arg2); }
Datum chartoi4(PG_FUNCTION_ARGS) { char arg1 = PG_GETARG_CHAR(0); PG_RETURN_INT32((int32) ((int8) arg1)); }
Datum tsvector_setweight(PG_FUNCTION_ARGS) { TSVector in = PG_GETARG_TSVECTOR(0); char cw = PG_GETARG_CHAR(1); TSVector out; int i, j; WordEntry *entry; WordEntryPos *p; int w = 0; switch (cw) { case 'A': case 'a': w = 3; break; case 'B': case 'b': w = 2; break; case 'C': case 'c': w = 1; break; case 'D': case 'd': w = 0; break; default: /* internal error */ elog(ERROR, "unrecognized weight: %d", cw); } out = (TSVector) palloc(VARSIZE(in)); memcpy(out, in, VARSIZE(in)); entry = ARRPTR(out); i = out->size; while (i--) { if ((j = POSDATALEN(out, entry)) != 0) { p = POSDATAPTR(out, entry); while (j--) { WEP_SETWEIGHT(*p, w); p++; } } entry++; } PG_FREE_IF_COPY(in, 0); PG_RETURN_POINTER(out); }
/* * charsend - converts char to binary format */ Datum charsend(PG_FUNCTION_ARGS) { char arg1 = PG_GETARG_CHAR(0); StringInfoData buf; pq_begintypsend(&buf); pq_sendbyte(&buf, arg1); PG_RETURN_BYTEA_P(pq_endtypsend(&buf)); }
/* * charout - converts 'x' to "x" * * Note that if the char value is \0, the resulting string will appear * to be empty (null-terminated after zero characters). So this is the * inverse of the charin() function for such data. */ Datum charout(PG_FUNCTION_ARGS) { char ch = PG_GETARG_CHAR(0); char *result = (char *) palloc(2); result[0] = ch; result[1] = '\0'; PG_RETURN_CSTRING(result); }
Datum caql_copy_to_in_memory_pg_class(PG_FUNCTION_ARGS) { text *inText = PG_GETARG_TEXT_P(0);; char *inStr = text_to_cstring(inText); char kind = PG_GETARG_CHAR(1); StringInfoData buf; initStringInfo(&buf); /* create tuples for pg_class table */ HeapTuple reltup = NULL; HeapTuple copytup = NULL; Form_pg_class relform; cqContext *pcqCtx; cqContext *pcqCtxInsert; pcqCtx = caql_beginscan( NULL, cql("SELECT * FROM pg_class " " WHERE relname = :1", CStringGetDatum((char *) inStr))); reltup = caql_getnext(pcqCtx); if (NULL == reltup) { appendStringInfo(&buf, "no tuples with relname=%s found!", inStr); } else { copytup = heaptuple_copy_to(reltup, NULL, NULL); relform = (Form_pg_class) GETSTRUCT(copytup); relform->relkind = kind; appendStringInfo(&buf, "table pg_class, insert 1 line (relname %s, relkind %c)", NameStr(relform->relname), kind); /* insert */ pcqCtxInsert = caql_beginscan( NULL, cql("INSERT INTO pg_class", NULL)); caql_insert_inmem(pcqCtxInsert, copytup); caql_endscan(pcqCtxInsert); heap_freetuple(copytup); } caql_endscan(pcqCtx); PG_RETURN_TEXT_P(cstring_to_text(buf.data)); }
/* char_bpchar() * Convert char to bpchar(1). */ Datum char_bpchar(PG_FUNCTION_ARGS) { char c = PG_GETARG_CHAR(0); BpChar *result; result = (BpChar *) palloc(VARHDRSZ + 1); VARATT_SIZEP(result) = VARHDRSZ + 1; *(VARDATA(result)) = c; PG_RETURN_BPCHAR_P(result); }
Datum char_text(PG_FUNCTION_ARGS) { char arg1 = PG_GETARG_CHAR(0); text *result = palloc(VARHDRSZ + 1); /* * Convert \0 to an empty string, for consistency with charout (and * because the text stuff doesn't like embedded nulls all that well). */ if (arg1 != '\0') { SET_VARSIZE(result, VARHDRSZ + 1); *(VARDATA(result)) = arg1; } else SET_VARSIZE(result, VARHDRSZ); PG_RETURN_TEXT_P(result); }
/* * master_create_distributed_table inserts the table and partition column * information into the partition metadata table. Note that this function * currently assumes the table is hash partitioned. */ Datum master_create_distributed_table(PG_FUNCTION_ARGS) { text *tableNameText = PG_GETARG_TEXT_P(0); text *partitionColumnText = PG_GETARG_TEXT_P(1); char partitionMethod = PG_GETARG_CHAR(2); Oid distributedTableId = ResolveRelationId(tableNameText); char relationKind = '\0'; char *partitionColumnName = text_to_cstring(partitionColumnText); char *tableName = text_to_cstring(tableNameText); Var *partitionColumn = NULL; /* verify target relation is either regular or foreign table */ relationKind = get_rel_relkind(distributedTableId); if (relationKind != RELKIND_RELATION && relationKind != RELKIND_FOREIGN_TABLE) { ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot distribute relation: %s", tableName), errdetail("Distributed relations must be regular or " "foreign tables."))); } /* this will error out if no column exists with the specified name */ partitionColumn = ColumnNameToColumn(distributedTableId, partitionColumnName); /* check for support function needed by specified partition method */ if (partitionMethod == HASH_PARTITION_TYPE) { Oid hashSupportFunction = SupportFunctionForColumn(partitionColumn, HASH_AM_OID, HASHPROC); if (hashSupportFunction == InvalidOid) { ereport(ERROR, (errcode(ERRCODE_UNDEFINED_FUNCTION), errmsg("could not identify a hash function for type %s", format_type_be(partitionColumn->vartype)), errdatatype(partitionColumn->vartype), errdetail("Partition column types must have a hash function " "defined to use hash partitioning."))); } } else if (partitionMethod == RANGE_PARTITION_TYPE) { Oid btreeSupportFunction = InvalidOid; /* * Error out immediately since we don't yet support range partitioning, * but the checks below are ready for when we do. * * TODO: Remove when range partitioning is supported. */ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("pg_shard only supports hash partitioning"))); btreeSupportFunction = SupportFunctionForColumn(partitionColumn, BTREE_AM_OID, BTORDER_PROC); if (btreeSupportFunction == InvalidOid) { ereport(ERROR, (errcode(ERRCODE_UNDEFINED_FUNCTION), errmsg("could not identify a comparison function for type %s", format_type_be(partitionColumn->vartype)), errdatatype(partitionColumn->vartype), errdetail("Partition column types must have a comparison function " "defined to use range partitioning."))); } } /* insert row into the partition metadata table */ InsertPartitionRow(distributedTableId, partitionMethod, partitionColumnText); PG_RETURN_VOID(); }
/* Note: this is used for both "char" and boolean datatypes */ Datum hashchar(PG_FUNCTION_ARGS) { PG_RETURN_UINT32(~((uint32) PG_GETARG_CHAR(0))); }