extension_dependency_choice.patch

text/x-patch

Filename: extension_dependency_choice.patch
Type: text/x-patch
Part: 0
Message: Satisfy extension dependency by one of multiple extensions

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: unified
File+
src/backend/commands/extension.c 0 0
diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c
new file mode 100644
index 278bbcf..5bf7f8e
*** a/src/backend/commands/extension.c
--- b/src/backend/commands/extension.c
*************** static void ApplyExtensionUpdates(Oid ex
*** 114,145 ****
  Oid
  get_extension_oid(const char *extname, bool missing_ok)
  {
! 	Oid			result;
! 	Relation	rel;
  	SysScanDesc scandesc;
  	HeapTuple	tuple;
  	ScanKeyData entry[1];
  
  	rel = heap_open(ExtensionRelationId, AccessShareLock);
  
  	ScanKeyInit(&entry[0],
  				Anum_pg_extension_extname,
! 				BTEqualStrategyNumber, F_NAMEEQ,
  				CStringGetDatum(extname));
  
! 	scandesc = systable_beginscan(rel, ExtensionNameIndexId, true,
! 								  SnapshotNow, 1, entry);
  
! 	tuple = systable_getnext(scandesc);
  
! 	/* We assume that there can be at most one matching tuple */
! 	if (HeapTupleIsValid(tuple))
! 		result = HeapTupleGetOid(tuple);
! 	else
! 		result = InvalidOid;
  
! 	systable_endscan(scandesc);
  
  	heap_close(rel, AccessShareLock);
  
  	if (!OidIsValid(result) && !missing_ok)
--- 114,152 ----
  Oid
  get_extension_oid(const char *extname, bool missing_ok)
  {
! 	Oid			result   = InvalidOid;
! 	Relation	rel, idx;
  	SysScanDesc scandesc;
  	HeapTuple	tuple;
  	ScanKeyData entry[1];
+ 	int         len      = strlen(extname) - 1;
+ 	bool        wildcard = (extname[len] == '*');
  
  	rel = heap_open(ExtensionRelationId, AccessShareLock);
+ 	idx = index_open(ExtensionNameIndexId, AccessShareLock);
  
  	ScanKeyInit(&entry[0],
  				Anum_pg_extension_extname,
! 				BTGreaterEqualStrategyNumber,
! 				F_NAMEGE,
  				CStringGetDatum(extname));
  
! 	scandesc = systable_beginscan_ordered(rel, idx,
! 										  SnapshotNow, 1, entry);
  
! 	if (HeapTupleIsValid(tuple = systable_getnext_ordered(scandesc, ForwardScanDirection)))
! 	{
! 		Form_pg_extension form = (Form_pg_extension) GETSTRUCT(tuple);
  
! 		if (wildcard
! 			? (strncmp(extname, NameStr(form->extname), len) == 0)
! 			: (strcmp(extname, NameStr(form->extname)) == 0))
! 			result = HeapTupleGetOid(tuple);
! 	}
  
! 	systable_endscan_ordered(scandesc);
  
+ 	index_close(idx, AccessShareLock);
  	heap_close(rel, AccessShareLock);
  
  	if (!OidIsValid(result) && !missing_ok)