<?xml version="1.0" encoding="UTF-8" standalone="yes"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-us"><id>https://blog.pgxn.org/tags/extensions/</id><title>Extensions</title><updated>2011-08-10T18:58:09Z</updated><link rel="self" type="application/atom+xml" href="https://blog.pgxn.org/tags/extensions/feed.xml"/><link rel="alternate" type="text/html" href="https://blog.pgxn.org/tags/extensions/"/><author><name>The PGXN Maintainers</name></author><generator uri="https://gohugo.io/" version="0.167.0">Hugo</generator><entry><id>https://blog.pgxn.org/post/8742312488</id><title type="html">My presentation at the 2012 PDXPUG PGDay</title><link rel="alternate" type="text/html" href="https://blog.pgxn.org/2011/video-building-and-distributing-extensions-without-c/"/><updated>2026-10-07T16:13:48Z</updated><published>2011-08-10T18:58:09Z</published><author><name>David E. Wheeler</name></author><category scheme="https://blog.pgxn.org/tags" term="pgxn" label="PGXN"/><category scheme="https://blog.pgxn.org/tags" term="pgday" label="PgDay"/><category scheme="https://blog.pgxn.org/tags" term="oscon" label="OSCON"/><category scheme="https://blog.pgxn.org/tags" term="c" label="C"/><category scheme="https://blog.pgxn.org/tags" term="extensions" label="Extensions"/><category scheme="https://blog.pgxn.org/tags" term="video" label="Video"/><summary type="html">&lt;figure>
&lt;figcaption>
My presentation at the 2012 PDXPUG PGDay. It covers the basics of how to
create useful extensions to PostgreSQL and distribute them on PGXN---without
needing to learn C.
&lt;/figcaption>
&lt;/figure></summary><content type="html" xml:base="https://blog.pgxn.org/" xml:space="preserve">&lt;figure>
&lt;figcaption>
My presentation at the 2012 PDXPUG PGDay. It covers the basics of how to
create useful extensions to PostgreSQL and distribute them on PGXN---without
needing to learn C.
&lt;/figcaption>
&lt;/figure>
</content></entry><entry><id>https://blog.pgxn.org/post/1473157261</id><title type="html">PGWest, Search Site Sneak Peak</title><link rel="alternate" type="text/html" href="https://blog.pgxn.org/2010/pgwest-and-sneak-peak/"/><updated>2026-10-07T16:13:48Z</updated><published>2010-11-03T21:09:00Z</published><author><name>David E. Wheeler</name></author><category scheme="https://blog.pgxn.org/tags" term="search" label="Search"/><category scheme="https://blog.pgxn.org/tags" term="pgwest" label="PgWest"/><category scheme="https://blog.pgxn.org/tags" term="presentation" label="Presentation"/><category scheme="https://blog.pgxn.org/tags" term="extensions" label="Extensions"/><category scheme="https://blog.pgxn.org/tags" term="postgresql-9.1" label="Postgresql 9.1"/><summary type="html"><![CDATA[I&rsquo;ve been working on my <a href="https://www.postgresqlconference.org/content/building-and-distributing-postgresql-extensions-without-learning-c">PostgreSQL Conference West presentation</a>, which
heavily features PGXN, of course. I think it&rsquo;s looking good. If you&rsquo;re at
<a href="https://www.postgresqlconference.org/2010/west/">PGWest</a> or are in the San Francisco area and free, come see the talk! Should
be a good introduction to creating PostgreSQL extensions and distributing them
on PGXN. The latest bit I added is a section on the modifications needed to
support the forthcoming <a href="https://s.coop/pgext"><code>CREATE EXTENSION</code></a> support slated for 9.1.
Fortunately it&rsquo;s dead simple, and will make dealing with extensions in the
database a lot simpler, administratively. Really looking forward to that. Of
course I&rsquo;ll post slides once the talk is over.]]></summary><content type="html" xml:base="https://blog.pgxn.org/" xml:space="preserve"><![CDATA[<p>I&rsquo;ve been working on my <a href="https://www.postgresqlconference.org/content/building-and-distributing-postgresql-extensions-without-learning-c">PostgreSQL Conference West presentation</a>, which
heavily features PGXN, of course. I think it&rsquo;s looking good. If you&rsquo;re at
<a href="https://www.postgresqlconference.org/2010/west/">PGWest</a> or are in the San Francisco area and free, come see the talk! Should
be a good introduction to creating PostgreSQL extensions and distributing them
on PGXN. The latest bit I added is a section on the modifications needed to
support the forthcoming <a href="https://s.coop/pgext"><code>CREATE EXTENSION</code></a> support slated for 9.1.
Fortunately it&rsquo;s dead simple, and will make dealing with extensions in the
database a lot simpler, administratively. Really looking forward to that. Of
course I&rsquo;ll post slides once the talk is over.</p>
<p>As part of preparing for the talk, and because there isn&rsquo;t currently much to
actually <em>see</em> of PGXN, I&rsquo;ve been mocking up the layout for the new search
site, which as you know from the <a href="https://pgxn.org/status.html">status page</a> is the next part of the project
I&rsquo;m slated to work on. I&rsquo;ve been committing the mockps to the gh-pages branch
of the repository, which means you can see what it looks like live on the net
<a href="https://theory.github.com/pgxn/">right here</a>. That&rsquo;s the home page, including our sponsor links and tag cloud.
Click the &ldquo;PGXN Search&rdquo; button to see a mockup of search results (or get them
<a href="https://theory.github.com/pgxn/results.html">here</a>). Click on any search result to see the mockup of a documentation page
(or link it <a href="https://theory.github.com/pgxn/pgtap.html">here</a>). The design is based on the <a href="https://www.oswd.org/design/preview/id/2839">lazydays</a> open-source Web
design, and I&rsquo;m quite happy with it. Your thoughts?</p>
<p>As this comes together, I&rsquo;m gearing up to start hacking on the app to produce
the search site. At this point, I&rsquo;m thinking that it would become the new home
page for <a href="https://pgxn.org/">PGXN</a>, rather than a separate search.pgxn.org site. Thoughts?</p>
<p>I&rsquo;ll post the slides tomorrow.</p>
]]></content></entry><entry><id>https://blog.pgxn.org/post/1368261274</id><title type="html">Reserved Extensions</title><link rel="alternate" type="text/html" href="https://blog.pgxn.org/2010/reserved-extensions/"/><updated>2026-10-07T16:13:48Z</updated><published>2010-10-21T20:43:00Z</published><author><name>David E. Wheeler</name></author><category scheme="https://blog.pgxn.org/tags" term="reserved-words" label="Reserved Words"/><category scheme="https://blog.pgxn.org/tags" term="reserved-extensions" label="Reserved Extensions"/><category scheme="https://blog.pgxn.org/tags" term="extensions" label="Extensions"/><category scheme="https://blog.pgxn.org/tags" term="postgresql" label="PostgreSQL"/><category scheme="https://blog.pgxn.org/tags" term="procedural-languages" label="Procedural Languages"/><category scheme="https://blog.pgxn.org/tags" term="pl/pgsql" label="PL/pgSQL"/><category scheme="https://blog.pgxn.org/tags" term="pl/perl" label="PL/Perl"/><category scheme="https://blog.pgxn.org/tags" term="contributed-modules" label="Contributed Modules"/><summary type="html"><![CDATA[<p>I&rsquo;m thinking about how to add support for reserved extensions. These are
extensions that one needs to depend on, but aren&rsquo;t distributed via PGXN.
Primarily, this means stuff distributed with the PostgreSQL core, including:</p>
<ul>
<li>PostgreSQL itself</li>
<li>Bundled procedural languages (plpgsql, plperl, etc.)</li>
<li>All <a href="https://www.postgresql.org/docs/current/static/contrib.html">contributed modules</a></li>
</ul>
<p>Basically, anything that an extension might want to declare as a dependency,
but that isn&rsquo;t on PGXN itself.</p>
<p>There are a number of ways to do this. Which do you think would be the best
approach?</p>]]></summary><content type="html" xml:base="https://blog.pgxn.org/" xml:space="preserve"><![CDATA[<p>I&rsquo;m thinking about how to add support for reserved extensions. These are
extensions that one needs to depend on, but aren&rsquo;t distributed via PGXN.
Primarily, this means stuff distributed with the PostgreSQL core, including:</p>
<ul>
<li>PostgreSQL itself</li>
<li>Bundled procedural languages (plpgsql, plperl, etc.)</li>
<li>All <a href="https://www.postgresql.org/docs/current/static/contrib.html">contributed modules</a></li>
</ul>
<p>Basically, anything that an extension might want to declare as a dependency,
but that isn&rsquo;t on PGXN itself.</p>
<p>There are a number of ways to do this. Which do you think would be the best
approach?</p>
<ol>
<li>Hard-code a list into the source code</li>
<li>Include an editable list in the runtime configuration file</li>
<li>Add a database table reserved for them and an API to edit it</li>
<li>Create a &ldquo;pgdev&rdquo; user and upload a distribution declaring all those
extensions in a <code>META.json</code> file</li>
<li>Same as 4, but actually upload the PostgreSQL source</li>
</ol>
<p>I&rsquo;m leaning towards #2, perhaps having it automatically maintain a list in the
database and a metadata file on the mirrors.</p>
<p>But what do you think? Opinions wanted!</p>
]]></content></entry><entry><id>https://blog.pgxn.org/post/1082188310</id><title type="html">Status Update: DB API, Extension Versions RFC</title><link rel="alternate" type="text/html" href="https://blog.pgxn.org/2010/db-status-update/"/><updated>2026-10-07T16:13:48Z</updated><published>2010-09-07T18:46:38Z</published><author><name>David E. Wheeler</name></author><category scheme="https://blog.pgxn.org/tags" term="status-update" label="Status Update"/><category scheme="https://blog.pgxn.org/tags" term="database" label="Database"/><category scheme="https://blog.pgxn.org/tags" term="api" label="API"/><category scheme="https://blog.pgxn.org/tags" term="documentation" label="Documentation"/><category scheme="https://blog.pgxn.org/tags" term="extensions" label="Extensions"/><category scheme="https://blog.pgxn.org/tags" term="versions" label="Versions"/><category scheme="https://blog.pgxn.org/tags" term="rfc" label="RFC"/><summary type="html"><![CDATA[I spent most of the time I had to work on PGXN the last two weeks creating the
database for <a href="https://github.com/theory/pgxn-manager/">PGXN Manager</a>. I had estimated 24 hours of work to design the
database. So far I&rsquo;ve logged 34 hours. But I think that will come out in the
wash, really, because I did a lot of work to generate JSON from database
functions. This is code I had originally expected to do in the app layer. I&rsquo;m
starting work on that this week, with an estimated 40 hours. Hope I can do it
in 30. :-)]]></summary><content type="html" xml:base="https://blog.pgxn.org/" xml:space="preserve"><![CDATA[<p>I spent most of the time I had to work on PGXN the last two weeks creating the
database for <a href="https://github.com/theory/pgxn-manager/">PGXN Manager</a>. I had estimated 24 hours of work to design the
database. So far I&rsquo;ve logged 34 hours. But I think that will come out in the
wash, really, because I did a lot of work to generate JSON from database
functions. This is code I had originally expected to do in the app layer. I&rsquo;m
starting work on that this week, with an estimated 40 hours. Hope I can do it
in 30. :-)</p>
<p>I&rsquo;m pretty happy with how the database API is turning out. See the nifty
<a href="https://github.com/theory/pgxn-manager/wiki/DB-API">database API documentation</a> I whipped up using <a href="https://github.com/theory/pgxn-manager/blob/master/bin/gendoc">gendoc</a> and embedded
<a href="https://fletcherpenney.net/multimarkdown/users_guide/multimarkdown_syntax_guide/">MultiMarkdown</a>. There are still a few tweaks I need to make. I just checked
in a change to eliminate all the <code>ALIAS</code>es I <a href="https://blog.pgxn.org/post/1053165383/alias-in-vogue">blogged about</a> last week. Turns
out that one can just <a href="https://archives.postgresql.org/pgsql-hackers/2010-09/msg00404.php">function-name-qualify</a> the function parameter names.
Who knew? I sure didn&rsquo;t.</p>
<p>But I do have a question for you, dear readers. Right now, the database
requires that extensions have unique version numbers in every distribution. So
if, for example, you uploaded the distribution foo 1.2.2 with the extension
bar 1.2.2, when you next uploaded foo 1.2.3, bar could not be 1.2.2. I
designed this this way by following my own practice of always incrementing the
version numbers of all modules included in my <a href="https://search.cpan.org/~dwheeler/">CPAN distributions</a>. So all
modules have unique version numbers, with never a duplicate.</p>
<p>However, CPAN itself only cares that distributions have unique version
numbers. It doesn&rsquo;t care about the version numbers of included modules. See,
for example, <a href="https://search.cpan.org/dist/HTML-Mason/">HTML::Mason</a>. Note that the various included modules have all
sorts of different version numbers, and many have no version numbers at all.
So while the core module has a version number (1.45 at the time of this
writing), if you click to look at older versions, say <a href="https://search.cpan.org/~drolsky/HTML-Mason-1.44/">Mason 1.44</a>, you&rsquo;ll see
that no other modules have their version numbers changed.</p>
<p>I don&rsquo;t think I want to allow extensions without version numbers on PGXN.
That&rsquo;s been a recipe for many annoyances with CPAN. But maybe I should allow
extension version numbers to repeat? The upside is less maintenance for
multi-extension distribution authors. The downside is potentially less
accuracy in the determination of prerequisites.</p>
<p>For example, say that we have two versions of distribution foo:</p>
<pre tabindex="0"><code>  -----------------------------------------------------------------------------
  Distribution                           Extensions
  -------------------------------------- --------------------------------------
  foo 1.2.2                              foo 1.2.2\
                                         bar 1.2.2
<h2 id="bar-122">foo 1.2.3                              foo 1.2.3<br>
bar 1.2.2</h2>
<p></code></pre><p>Note how the version number of extension bar has not changed between releases.
But if I was a user of both foo and bar, and I specified that I required bar
1.2.2 but was actually using stuff in foo 1.2.3, I could end up with errors
because I would only have foo 1.2.3.</p></p>
<p>This is an issue periodically faced by Perl hackers. I might require
HTML::Mason::ApacheHandler 1.69 but really what I need is HTML::Mason 1.44. Of
course, as a Perl hacker, it&rsquo;s my responsibility to make sure I require
exactly what I need, but sometimes it&rsquo;s not clear what&rsquo;s the primary module in
a distribution. And if I don&rsquo;t realize that the version number of
HTML::Mason::ApacheHandler doesn&rsquo;t change with every release, I might make
mistakes.</p>
<p>Maybe that&rsquo;s okay. Maybe PGXN should be less rigid like this. But I&rsquo;m leaning
toward keeping things as they are and requiring new versions of every
extension in every upload of a distribution. It&rsquo;s a bit tougher for those
(few?) hackers who will create multi-extension distributions, but probably
more reliable for everyone else.</p>
<p>What do you think?</p>
<p>Anyway, I&rsquo;m getting to work on the Web app this week while this issue
percolates. Been studying up on <a href="https://plackperl.org/">Plack</a>. So nice!</p>
]]></content></entry></feed>