Datum set_timetravel(PG_FUNCTION_ARGS) { Name relname = PG_GETARG_NAME(0); int32 on = PG_GETARG_INT32(1); char *rname; char *d; char *s; int32 ret; TTOffList *p, *pp; for (pp = (p = &TTOff)->next; pp; pp = (p = pp)->next) { if (namestrcmp(relname, pp->name) == 0) break; } if (pp) { /* OFF currently */ if (on != 0) { /* turn ON */ p->next = pp->next; free(pp); } ret = 0; } else { /* ON currently */ if (on == 0) { /* turn OFF */ s = rname = DatumGetCString(DirectFunctionCall1(nameout, NameGetDatum(relname))); if (s) { pp = malloc(sizeof(TTOffList) + strlen(rname)); if (pp) { pp->next = NULL; p->next = pp; d = pp->name; while (*s) *d++ = tolower((unsigned char) *s++); *d = '\0'; } pfree(rname); } } ret = 1; } PG_RETURN_INT32(ret); }
Datum get_timetravel(PG_FUNCTION_ARGS) { Name relname = PG_GETARG_NAME(0); TTOffList *pp; for (pp = TTOff.next; pp; pp = pp->next) { if (namestrcmp(relname, pp->name) == 0) PG_RETURN_INT32(0); } PG_RETURN_INT32(1); }
/* * TypeRename * This renames a type * * Note: any associated array type is *not* renamed; caller must make * another call to handle that case. Currently this is only used for * renaming types associated with tables, for which there are no arrays. */ void TypeRename(Oid typeOid, const char *newTypeName) { Relation pg_type_desc; HeapTuple tuple; Form_pg_type form; cqContext *pcqCtx; cqContext cqc, cqc2; pg_type_desc = heap_open(TypeRelationId, RowExclusiveLock); pcqCtx = caql_addrel(cqclr(&cqc), pg_type_desc); tuple = caql_getfirst( pcqCtx, cql("SELECT * FROM pg_type " " WHERE oid = :1 " " FOR UPDATE ", ObjectIdGetDatum(typeOid))); if (!HeapTupleIsValid(tuple)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("type with OID \"%d\" does not exist", typeOid))); form = (Form_pg_type) GETSTRUCT(tuple); if (namestrcmp(&(form->typname), newTypeName)) { if (caql_getcount( caql_addrel(cqclr(&cqc2), pg_type_desc), cql("SELECT COUNT(*) FROM pg_type " " WHERE typname = :1 " " AND typnamespace = :2 ", CStringGetDatum((char *) newTypeName), ObjectIdGetDatum(form->typnamespace)))) { ereport(ERROR, (errcode(ERRCODE_DUPLICATE_OBJECT), errmsg("type \"%s\" already exists", newTypeName))); } namestrcpy(&(form->typname), newTypeName); caql_update_current(pcqCtx, tuple); /* update the system catalog indexes (implicit) */ } heap_freetuple(tuple); heap_close(pg_type_desc, RowExclusiveLock); }
int SPI_fnumber(TupleDesc tupdesc, const char *fname) { int res; Form_pg_attribute sysatt; for (res = 0; res < tupdesc->natts; res++) { if (namestrcmp(&tupdesc->attrs[res]->attname, fname) == 0) return res + 1; } sysatt = SystemAttributeByName(fname, true /* "oid" will be accepted */ ); if (sysatt != NULL) return sysatt->attnum; /* SPI_ERROR_NOATTRIBUTE is different from all sys column numbers */ return SPI_ERROR_NOATTRIBUTE; }
/* * VerifyErrorTableAttr * * Called by ValidateErrorTableMetaData() on each table attribute to verify * that it has the right predefined name, type and other attr characteristics. */ static void VerifyErrorTableAttr(Form_pg_attribute *attr, int attrnum, const char *expected_attname, Oid expected_atttype, char *relname) { bool cur_attisdropped = attr[attrnum - 1]->attisdropped; Name cur_attname = &(attr[attrnum - 1]->attname); Oid cur_atttype = attr[attrnum - 1]->atttypid; int4 cur_attndims = attr[attrnum - 1]->attndims; if(cur_attisdropped) ereport(ERROR, (errcode(ERRCODE_INVALID_TABLE_DEFINITION), errmsg("Relation \"%s\" includes dropped attributes and is " "therefore not of a valid error table format", relname))); if (namestrcmp(cur_attname, expected_attname) != 0) ereport(ERROR, (errcode(ERRCODE_INVALID_TABLE_DEFINITION), errmsg("Relation \"%s\" is an invalid error table. Expected " "attribute \"%s\" found \"%s\"", relname, expected_attname, NameStr(*cur_attname)))); if(cur_atttype != expected_atttype) ereport(ERROR, (errcode(ERRCODE_INVALID_TABLE_DEFINITION), errmsg("Relation \"%s\" is an invalid error table. Wrong data " "type for attribute \"%s\"", relname, NameStr(*cur_attname)))); if(cur_attndims > 0) ereport(ERROR, (errcode(ERRCODE_INVALID_TABLE_DEFINITION), errmsg("Relation \"%s\" is an invalid error table. Attribute " "\"%s\" has more than zero dimensions (array).", relname, NameStr(*cur_attname)))); }