SlideShare a Scribd company logo
1 of 192
Releasing Extensions
                      on PGXN
                                               David E. Wheeler
                                            PostgreSQL Experts, Inc.

                                                             PDXPUG
                                                          April 21, 2019



Text: Attribution-Noncommercial-Share Alike 3.0 United States:
http://creativecommons.org/licenses/by-nc-sa/3.0/us/
Images licensed independently and © Their respective owners.
Problem Solved
Problem Solved
Solved a database problem
Problem Solved
Solved a database problem

Want to share
Problem Solved
Solved a database problem

Want to share

Open source it
Problem Solved
Solved a database problem

Want to share

Open source it

Where to distribute
PGXN
PGXN
“The PostgreSQL Extension
 network, is a central
 distribution system for
 open-source PostgreSQL
 extension libraries.”
wheeler
wheeler
Your Solution
Your Solution
You’ve solved a problem
Your Solution
You’ve solved a problem

Using database objects
Your Solution
You’ve solved a problem

Using database objects

Packaged like contrib
Your Solution
You’ve solved a problem

Using database objects

Packaged like contrib

Want to open-source it
Your Solution
You’ve solved a problem

Using database objects

Packaged like contrib

Want to open-source it

How to distribute on PGXN?
Your Solution
You’ve solved a problem

Using database objects

Packaged like contrib

Want to open-source it

How to distribute on PGXN?

Just one thing:
Your Solution
You’ve solved a problem

Using database objects

Packaged like contrib

Want to open-source it

How to distribute on PGXN?

Just one thing:

META.json
META.json




META.json
META.json
{



"name":






"pair",



"abstract":


"A
key/value
pair
data
type",



"version":



"0.1.0",



"maintainer":
"Tom
Lane
<tgl@postgresql.org>",



"license":



"postgresql",



"meta‐spec":

{






"version":
"1.0.0",






"url":
"http://pgxn.org/meta/spec.txt"



}
}




 META.json
META.json
{



"name":






"pair",



"abstract":


"A
key/value
pair
data
type",



"version":



"0.1.0",



"maintainer":
"Tom
Lane
<tgl@postgresql.org>",



"license":



"postgresql",



"meta‐spec":

{






"version":
"1.0.0",






"url":
"http://pgxn.org/meta/spec.txt"



}
}




 META.json
META.json
{



"name":






"pair",



"abstract":


"A
key/value
pair
data
type",



"version":



"0.1.0",



"maintainer":
"Tom
Lane
<tgl@postgresql.org>",



"license":



"postgresql",



"meta‐spec":

{






"version":
"1.0.0",






"url":
"http://pgxn.org/meta/spec.txt"



}
}




 META.json
META.json
{



"name":






"pair",



"abstract":


"A
key/value
pair
data
type",



"version":



"0.1.0",



"maintainer":
"Tom
Lane
<tgl@postgresql.org>",



"license":



"postgresql",



"meta‐spec":

{






"version":
"1.0.0",






"url":
"http://pgxn.org/meta/spec.txt"



}
}




 META.json
META.json
{                   semver.org



"name":






"pair",



"abstract":


"A
key/value
pair
data
type",



"version":



"0.1.0",



"maintainer":
"Tom
Lane
<tgl@postgresql.org>",



"license":



"postgresql",



"meta‐spec":

{






"version":
"1.0.0",






"url":
"http://pgxn.org/meta/spec.txt"



}
}




 META.json
META.json
{



"name":






"pair",



"abstract":


"A
key/value
pair
data
type",



"version":



"0.1.0",



"maintainer":
"Tom
Lane
<tgl@postgresql.org>",



"license":



"postgresql",



"meta‐spec":

{






"version":
"1.0.0",






"url":
"http://pgxn.org/meta/spec.txt"



}
}




 META.json
META.json
{



"name":






"pair",



"abstract":


"A
key/value
pair
data
type",



"version":



"0.1.0",



"maintainer":
"Tom
Lane
<tgl@postgresql.org>",



"license":



"postgresql",



"meta‐spec":

{






"version":
"1.0.0",






"url":
"http://pgxn.org/meta/spec.txt"



}
}




 META.json
META.json
{



"name":






"pair",



"abstract":


"A
key/value
pair
data
type",



"version":



"0.1.0",



"maintainer":
"Tom
Lane
<tgl@postgresql.org>",



"license":



"postgresql",



"meta‐spec":

{






"version":
"1.0.0",






"url":
"http://pgxn.org/meta/spec.txt"



}
}




             At least this…
 META.json
Package it Up!
%

Package it Up!
%



git
archive
‐‐format
zip
‐‐prefix=pair‐0.1.0/



‐‐output
~/Desktop/pair‐0.1.0.zip
master
%
Package it Up!
%



git
archive
‐‐format
zip
‐‐prefix=pair‐0.1.0/



‐‐output
~/Desktop/pair‐0.1.0.zip
master
%




                         Easy, eh?
Tom Lane

tgl@postgresql.org

http://postgresql.org/~tgl/

tomlane

@tomlane




I’ve got some killer extensions in development that I think
will be useful to everyone, including:

* pair: an ordered pair data type
* PL/Brainfuck: just what it sounds like
Tom Lane

tgl@postgresql.org

http://postgresql.org/~tgl/

tomlane

@tomlane




I’ve got some killer extensions in development that I think
will be useful to everyone, including:

* pair: an ordered pair data type
* PL/Brainfuck: just what it sounds like
tomlane
omg WTF ROTFL lolz
omg WTF ROTFL lolz
omg WTF ROTFL lolz
omg WTF ROTFL lolz
tomlane

●●●●●●●●●●●●●●●●●●
tomlane
No resources,
tags, or long
 description
No documentation link
Plain text
README
Add README Extension
%

Add README Extension
%



git
mv
README.pair
README.md
%
Add README Extension
%



git
mv
README.pair
README.md
%




                         Easy, eh?
PGXN Markup
PGXN Markup
HTML            Textile

Markdown        Trac

MultiMarkdown   MediaWiki

Pod
PGXN Markup
HTML                      Textile

Markdown                  Trac

MultiMarkdown             MediaWiki

Pod


Text::Markup (fork me!)
PGXN Markup
HTML                      Textile

Markdown                  Trac

MultiMarkdown             MediaWiki

Pod


Text::Markup (fork me!)

Write some Docs!
Add Documentation
Add Documentation
Use any supported markup
Add Documentation
Use any supported markup

Put wherever you like
Add Documentation
Use any supported markup

Put wherever you like

Recommend the doc/
doc/pair.md
pair
0.1.1
==========

Synopsis
‐‐‐‐‐‐‐‐





%
CREATE
EXTENSION
pair;




CREATE
EXTENSION





%
SELECT
'foo'
~>
'bar';








pair








‐‐‐‐‐‐‐‐‐‐‐‐





(foo,bar)

Description
‐‐‐‐‐‐‐‐‐‐‐

This
library
contains
a
single
PostgreSQL
extension,
a

key/value
pair
data
type
called
“pair”,
along
with
a

convenience
function
for
constructing
key/value
pairs.

It's
just
a
simple
thing,
really:
a
two‐value
composite

type
that
can
store
any
type
of
value
in
its
slots,

which
are
named
`k`
and
`v`.
 doc/pair.md
pair
0.1.1
==========

Synopsis
‐‐‐‐‐‐‐‐
               Must be UTF-8
                     or use a




%
CREATE
EXTENSION
pair;




CREATE
EXTENSION



                        BOM




%
SELECT
'foo'
~>
'bar';








pair








‐‐‐‐‐‐‐‐‐‐‐‐





(foo,bar)

Description
‐‐‐‐‐‐‐‐‐‐‐

This
library
contains
a
single
PostgreSQL
extension,
a

key/value
pair
data
type
called
“pair”,
along
with
a

convenience
function
for
constructing
key/value
pairs.

It's
just
a
simple
thing,
really:
a
two‐value
composite

type
that
can
store
any
type
of
value
in
its
slots,

which
are
named
`k`
and
`v`.
 doc/pair.md
Add Description
{



"name":






"pair",



"abstract":


"A
key/value
pair
data
type",



"version":



"0.1.0",



"maintainer":
"Tom
Lane
<tgl@postgresql.org>",



"license":



"postgresql",



"meta‐spec":

{






"version":
"1.0.0",






"url":
"http://pgxn.org/meta/spec.txt"



}
}




META.json
Add Description
{



"name":






"pair",



"abstract":


"A
key/value
pair
data
type",



"version":



"0.1.0",



"maintainer":
"Tom
Lane
<tgl@postgresql.org>",



"license":



"postgresql",



"description":
"This
library
contains
a
key/value

pair
data
type
called
“pair”,
along
with
an
operator
for

constructing
key/value
pairs.",



"meta‐spec":

{






"version":
"1.0.0",






"url":
"http://pgxn.org/meta/spec.txt"



}
}


META.json
Add Tags



"meta‐spec":

{






"version":
"1.0.0",






"url":
"http://pgxn.org/meta/spec.txt"



}
}




META.json
Add Tags



"meta‐spec":

{






"version":
"1.0.0",






"url":
"http://pgxn.org/meta/spec.txt"




,



}



"tags":
[






"ordered
pair",






"pair",






"key
value"



]
}




META.json
Add Resources



"tags":
[






"ordered
pair",






"pair",






"key
value"



]
}




META.json
Add Resources



"tags":
[






"ordered
pair",






"pair",






"key
value"




,



]



"resources":
{






"bugtracker":
{









"web":
"https://github.com/tgl/kv‐pair/issues/"






},






"repository":
{









"type":
"git",









"url":
"git://github.com/tgl/kv‐pair.git",









"web":
"https://github.com/tgl/kv‐pair/"






}



}
}
META.json
What Extensions
What Extensions
Might have multiple extensions
What Extensions
Might have multiple extensions

Extension might have own version
What Extensions
Might have multiple extensions

Extension might have own version

Might have documentation file
What Extensions
Might have multiple extensions

Extension might have own version

Might have documentation file

Help PGXN out!
What Extensions
Might have multiple extensions

Extension might have own version

Might have documentation file

Help PGXN out!

Add “provides” to META.json
Add Provides






"repository":
{









"type":
"git",









"url":
"git://github.com/tgl/kv‐pair.git",









"web":
"https://github.com/tgl/kv‐pair/"






}



}
}




META.json
Add Provides






"repository":
{









"type":
"git",









"url":
"git://github.com/tgl/kv‐pair.git",









"web":
"https://github.com/tgl/kv‐pair/"






}




,



}



"provides":
{






"pair":
{









"file":
"sql/pair.sql",









"version":
"0.1.0",









"abstract":
"A
key/value
pair
data
type",









"docfile":
"doc/pair.md"






}



}
}

META.json
Add Provides






"repository":
{









"type":
"git",









"url":
"git://github.com/tgl/kv‐pair.git",









"web":
"https://github.com/tgl/kv‐pair/"






}




,



}



"provides":
{






"pair":
{









"file":
"sql/pair.sql",  It’s unchanged!









"version":
"0.1.0",









"abstract":
"A
key/value
pair
data
type",









"docfile":
"doc/pair.md"






}



}
}

META.json
Update Version
{



"name":






"pair",



"abstract":


"A
key/value
pair
data
type",



"version":



"0.1.
",
                      0



"maintainer":
"Tom
Lane
<tgl@postgresql.org>",



"license":



"postgresql",



"description":
"This
library
contains
a
key/value

pair
data
type
called
“pair”,
along
with
an
operator
for

constructing
key/value
pairs.",


"meta‐spec":

{






"version":
"1.0.0",






"url":
"http://pgxn.org/meta/spec.txt"



}
}


META.json
Update Version
{



"name":






"pair",



"abstract":


"A
key/value
pair
data
type",



"version":



"0.1.
",
                      1



"maintainer":
"Tom
Lane
<tgl@postgresql.org>",



"license":



"postgresql",



"description":
"This
library
contains
a
key/value

pair
data
type
called
“pair”,
along
with
an
operator
for

constructing
key/value
pairs.",


"meta‐spec":

{






"version":
"1.0.0",






"url":
"http://pgxn.org/meta/spec.txt"



}
}


META.json
Update Version
{



"name":






"pair",
                               Must be



"abstract":


"A
key/value
pair
data
type",



"version":



"0.1.
",
                      1
                               unique.



"maintainer":
"Tom
Lane
<tgl@postgresql.org>",



"license":



"postgresql",



"description":
"This
library
contains
a
key/value

pair
data
type
called
“pair”,
along
with
an
operator
for

constructing
key/value
pairs.",


"meta‐spec":

{






"version":
"1.0.0",






"url":
"http://pgxn.org/meta/spec.txt"



}
}


META.json
Package it up
%

Package it up
%



git
archive
‐‐format
zip
‐‐prefix=pair‐0.1.1/



‐‐output
~/Desktop/pair‐0.1.1.zip
master
%
Release it
Lots of great
 metadata!
Link to
documentation!
README in
  HTML!
README in
  HTML!
Niiiice.
What Else?
What Else?
Recommended file layout
What Else?
Recommended file layout

Standard Makefile format
What Else?
Recommended file layout

Standard Makefile format

9.1 CREATE EXTENSION support
What Else?
Recommended file layout

Standard Makefile format

9.1 CREATE EXTENSION support

  With compatibility!
File Recommendations
File Recommendations
SQL source in sql/
File Recommendations
SQL source in sql/

C source in src/
File Recommendations
SQL source in sql/

C source in src/

Tests in test/
File Recommendations
SQL source in sql/

C source in src/

Tests in test/

Documentation in docs/
Rearrange
%

Rearrange
%

%
mkdir
test
Rearrange
%

%
mkdir
test
%
git
mv
sql
test/
Rearrange
%

%
mkdir
test
%
git
mv
sql
test/
%
git
mv
expected
test/
Rearrange
%

%
mkdir
test
%
git
mv
sql
test/
%
git
mv
expected
test/
%
mkdir
sql
Rearrange
%

%
mkdir
test
%
git
mv
sql
test/
%
git
mv
expected
test/
%
mkdir
sql
%
git
mv
*.sql
sql/
Makefile




Makefile
Makefile
DATA



=
$(wildcard
sql/*.sql)
DOCS



=
$(wildcard
doc/*.txt)
MODULES
=
$(patsubst
%.c,%,$(wildcard
src/*.c))




 Makefile
Makefile
DATA



=
$(wildcard
sql/*.sql)
DOCS



=
$(wildcard
doc/*.txt)
MODULES
=
$(patsubst
%.c,%,$(wildcard
src/*.c))




 Makefile
Makefile
DATA



=
$(wildcard
sql/*.sql)
DOCS



=
$(wildcard
doc/*.txt)
MODULES
=
$(patsubst
%.c,%,$(wildcard
src/*.c))




 Makefile
Makefile
DATA



=
$(wildcard
sql/*.sql)
DOCS



=
$(wildcard
doc/*.txt)
MODULES
=
$(patsubst
%.c,%,$(wildcard
src/*.c))




 Makefile
Makefile
DATA



=
$(wildcard
sql/*.sql)
DOCS



=
$(wildcard
doc/*.txt)
MODULES
=
$(patsubst
%.c,%,$(wildcard
src/*.c))

TESTS
=
$(wildcard
test/sql/*.sql)
REGRESS
=
$(patsubst
test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS
=
‐‐inputdir=test




 Makefile
Makefile
DATA



=
$(wildcard
sql/*.sql)
DOCS



=
$(wildcard
doc/*.txt)
MODULES
=
$(patsubst
%.c,%,$(wildcard
src/*.c))

TESTS
=
$(wildcard
test/sql/*.sql)
REGRESS
=
$(patsubst
test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS
=
‐‐inputdir=test




 Makefile
Makefile
DATA



=
$(wildcard
sql/*.sql)
DOCS



=
$(wildcard
doc/*.txt)
MODULES
=
$(patsubst
%.c,%,$(wildcard
src/*.c))

TESTS
=
$(wildcard
test/sql/*.sql)
REGRESS
=
$(patsubst
test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS
=
‐‐inputdir=test




 Makefile
Makefile
DATA



=
$(wildcard
sql/*.sql)
DOCS



=
$(wildcard
doc/*.txt)
MODULES
=
$(patsubst
%.c,%,$(wildcard
src/*.c))

TESTS
=
$(wildcard
test/sql/*.sql)
REGRESS
=
$(patsubst
test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS
=
‐‐inputdir=test




 Makefile
Makefile

                   inputdir
DATA



=
$(wildcard
sql/*.sql)
DOCS



=
$(wildcard
doc/*.txt)
MODULES
=
$(patsubst
%.c,%,$(wildcard
src/*.c))

TESTS
=
$(wildcard
test/sql/*.sql)
REGRESS
=
$(patsubst
test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS
=
‐‐inputdir=test




 Makefile
Makefile
DATA



=
$(wildcard
sql/*.sql)
DOCS



=
$(wildcard
doc/*.txt)
MODULES
=
$(patsubst
%.c,%,$(wildcard
src/*.c))

TESTS
=
$(wildcard
test/sql/*.sql)
REGRESS
=
$(patsubst
test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS
=
‐‐inputdir=test

PG_CONFIG
=
pg_config
PGXS
:=
$(shell
$(PG_CONFIG)
‐‐pgxs)
include
$(PGXS)




 Makefile
Makefile
DATA



=
$(wildcard
sql/*.sql)
DOCS



=
$(wildcard
doc/*.txt)
MODULES
=
$(patsubst
%.c,%,$(wildcard
src/*.c))

TESTS
=
$(wildcard
test/sql/*.sql)
REGRESS
=
$(patsubst
test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS
=
‐‐inputdir=test

PG_CONFIG
=
pg_config
PGXS
:=
$(shell
$(PG_CONFIG)
‐‐pgxs)
include
$(PGXS)




 Makefile
Makefile
DATA



=
$(wildcard
sql/*.sql)
DOCS



=
$(wildcard
doc/*.txt)
MODULES
=
$(patsubst
%.c,%,$(wildcard
src/*.c))

TESTS
=
$(wildcard
test/sql/*.sql)
REGRESS
=
$(patsubst
test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS
=
‐‐inputdir=test

PG_CONFIG
=
pg_config
PGXS
:=
$(shell
$(PG_CONFIG)
‐‐pgxs)
include
$(PGXS)




 Makefile
Makefile
DATA



=
$(wildcard
sql/*.sql)
DOCS



=
$(wildcard
doc/*.txt)
MODULES
=
$(patsubst
%.c,%,$(wildcard
src/*.c))

TESTS
=
$(wildcard
test/sql/*.sql)
REGRESS
=
$(patsubst
test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS
=
‐‐inputdir=test

PG_CONFIG
=
pg_config
PGXS
:=
$(shell
$(PG_CONFIG)
‐‐pgxs)
include
$(PGXS)




 Makefile
CREATE EXTENSION
CREATE EXTENSION
New in 9.1
CREATE EXTENSION
New in 9.1

Add extension to a DB with
CREATE EXTENSION
New in 9.1

Add extension to a DB with

  CREATE EXTENSION pair;
CREATE EXTENSION
New in 9.1

Add extension to a DB with

  CREATE EXTENSION pair;

No need to run SQL script in psql
Packaging Extensions
       Needs
Packaging Extensions
       Needs
Control file
Packaging Extensions
       Needs
Control file

Migration from unpackaged
Packaging Extensions
       Needs
Control file

Migration from unpackaged

  pair--unpackaged--0.1.0.sql
Packaging Extensions
       Needs
Control file

Migration from unpackaged

  pair--unpackaged--0.1.0.sql

Properly-named SQL script
Packaging Extensions
       Needs
Control file

Migration from unpackaged

  pair--unpackaged--0.1.0.sql

Properly-named SQL script

  pair--0.1.0.sql
Create the control file




pair.control
Create the control file

#
pair
extension
comment
=
'A
key/value
pair
data
type'
default_version
=
'0.1.0'
module_pathname
=
'$libdir/pair'
relocatable
=
true
superuser
=
false




 pair.control
Create the control file

#
pair
extension
comment
=
'A
key/value
pair
data
type'
default_version
=
'0.1.0'
module_pathname
=
'$libdir/pair'
relocatable
=
true
superuser
=
false




 pair.control
Create the control file
                         Optional
#
pair
extension
comment
=
'A
key/value
pair
data
type'
default_version
=
'0.1.0'
module_pathname
=
'$libdir/pair'
relocatable
=
true
superuser
=
false




 pair.control
Create the control file

#
pair
extension
comment
=
'A
key/value
pair
data
type'
default_version
=
'0.1.0'
module_pathname
=
'$libdir/pair'
relocatable
=
true
superuser
=
false




 pair.control
Create the control file

#
pair
extension
comment
=
'A
key/value
pair
data
type'
default_version
=
'0.1.0'
module_pathname
=
'$libdir/pair'
relocatable
=
true
superuser
=
false




 pair.control
Create the control file

#
pair
extension
                                 For C
comment
=
'A
key/value
pair
data
type'
default_version
=
'0.1.0'        code
module_pathname
=
'$libdir/pair'
relocatable
=
true
superuser
=
false




 pair.control
Create the control file

#
pair
extension
comment
=
'A
key/value
pair
data
type'
default_version
=
'0.1.0'
module_pathname
=
'$libdir/pair'
relocatable
=
true
superuser
=
false




 pair.control
Create the control file

#
pair
extension Can move
comment
=
'A
key/value
pair
data
type'
                 schemas
default_version
=
'0.1.0'
module_pathname
=
'$libdir/pair'
relocatable
=
true
superuser
=
false




 pair.control
Create the control file

#
pair
extension
comment
=
'A
key/value
pair
data
type'
default_version
=
'0.1.0'
module_pathname
=
'$libdir/pair'
relocatable
=
true
superuser
=
false




 pair.control
Create the control file

#
pair
extension
comment
=
'A
key/value
pair
data
type'
default_version
=
'0.1.0'
module_pathname
=
'$libdir/pair'
relocatable
=
true Not required
superuser
=
false
                     to install



 pair.control
Create the control file

#
pair
extension
comment
=
'A
key/value
pair
data
type'
default_version
=
'0.1.0'
module_pathname
=
'$libdir/pair'
relocatable
=
true
superuser
=
false



                pair.control
 pair.control
Migration from
                    Unpackaged




sql/pair‐‐unpac…
Migration from
                      Unpackaged
ALTER
EXTENSION
pair
ADD
TYPE
pair;
ALTER
EXTENSION
pair
ADD
FUNCTION
pair(anyelement,
text);
ALTER
EXTENSION
pair
ADD
FUNCTION
pair(text,
anyelement);
ALTER
EXTENSION
pair
ADD
FUNCTION
pair(anyelement,
anyelement);
ALTER
EXTENSION
pair
ADD
FUNCTION
pair(text,
text);
ALTER
EXTENSION
pair
ADD
OPERATOR
~>(text,
anyelement);
ALTER
EXTENSION
pair
ADD
OPERATOR
~>(anyelement,
text);
ALTER
EXTENSION
pair
ADD
OPERATOR
~>(anyelement,
anyelement);
ALTER
EXTENSION
pair
ADD
OPERATOR
~>(text,
text);




          sql/pair--unpackaged--0.1.0.sql
  sql/pair‐‐unpac…
Update the Makefile




Makefile
Update the Makefile
EXTENSION



=
semver
EXTVERSION


=
$(shell
grep
default_version



$(EXTENSION).control
|

sed
‐e



"s/default_version[
]*=[
]*'([^']*)'/1/")
DATA








=
$(filter‐out
$(wildcard
sql/*‐‐*.sql),$
(wildcard
sql/*.sql))
DOCS








=
$(wildcard
doc/*.txt)
TESTS







=
$(wildcard
test/sql/*.sql)
REGRESS





=
$(patsubst
test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS
=
‐‐inputdir=test
MODULES





=
$(patsubst
%.c,%,$(wildcard
src/*.c))

PG_CONFIG



=
pg_config
PG91

=
$(shell
$(PG_CONFIG)
‐‐version



|
grep
‐qE
"
8.|
9.0"
&&
echo
no
||
echo
yes)

 Makefile
Update the Makefile
EXTENSION



=
semver
EXTVERSION


=
$(shell
grep
default_version



$(EXTENSION).control
|

sed
‐e



"s/default_version[
]*=[
]*'([^']*)'/1/")
DATA








=
$(filter‐out
$(wildcard
sql/*‐‐*.sql),$
(wildcard
sql/*.sql))
DOCS








=
$(wildcard
doc/*.txt)
TESTS







=
$(wildcard
test/sql/*.sql)
REGRESS





=
$(patsubst
test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS
=
‐‐inputdir=test
MODULES





=
$(patsubst
%.c,%,$(wildcard
src/*.c))

PG_CONFIG



=
pg_config
PG91

=
$(shell
$(PG_CONFIG)
‐‐version



|
grep
‐qE
"
8.|
9.0"
&&
echo
no
||
echo
yes)

 Makefile
Update the Makefile
EXTENSION



=
semver
EXTVERSION


=
$(shell
grep
default_version



$(EXTENSION).control
|

sed
‐e



"s/default_version[
]*=[
]*'([^']*)'/1/")
DATA








=
$(filter‐out
$(wildcard
sql/*‐‐*.sql),$
(wildcard
sql/*.sql))
DOCS








=
$(wildcard
doc/*.txt)
TESTS







=
$(wildcard
test/sql/*.sql)
REGRESS





=
$(patsubst
test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS
=
‐‐inputdir=test
MODULES





=
$(patsubst
%.c,%,$(wildcard
src/*.c))

PG_CONFIG



=
pg_config
PG91

=
$(shell
$(PG_CONFIG)
‐‐version



|
grep
‐qE
"
8.|
9.0"
&&
echo
no
||
echo
yes)

 Makefile
Update the Makefile
                                               Extract from
EXTENSION



=
semver
EXTVERSION


=
$(shell
grep
default_version
   control file


$(EXTENSION).control
|

sed
‐e



"s/default_version[
]*=[
]*'([^']*)'/1/")
DATA








=
$(filter‐out
$(wildcard
sql/*‐‐*.sql),$
(wildcard
sql/*.sql))
DOCS








=
$(wildcard
doc/*.txt)
TESTS







=
$(wildcard
test/sql/*.sql)
REGRESS





=
$(patsubst
test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS
=
‐‐inputdir=test
MODULES





=
$(patsubst
%.c,%,$(wildcard
src/*.c))

PG_CONFIG



=
pg_config
PG91

=
$(shell
$(PG_CONFIG)
‐‐version



|
grep
‐qE
"
8.|
9.0"
&&
echo
no
||
echo
yes)

 Makefile
Update the Makefile
EXTENSION



=
semver
EXTVERSION


=
$(shell
grep
default_version



$(EXTENSION).control
|

sed
‐e



"s/default_version[
]*=[
]*'([^']*)'/1/")
DATA








=
$(filter‐out
$(wildcard
sql/*‐‐*.sql),$
(wildcard
sql/*.sql))
DOCS








=
$(wildcard
doc/*.txt)
TESTS







=
$(wildcard
test/sql/*.sql)
REGRESS





=
$(patsubst
test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS
=
‐‐inputdir=test
MODULES





=
$(patsubst
%.c,%,$(wildcard
src/*.c))

PG_CONFIG



=
pg_config
PG91

=
$(shell
$(PG_CONFIG)
‐‐version



|
grep
‐qE
"
8.|
9.0"
&&
echo
no
||
echo
yes)

 Makefile
Update the Makefile
EXTENSION



=
semver
EXTVERSION


=
$(shell
grep
default_version



$(EXTENSION).control
|

sed
‐e



"s/default_version[
]*=[
]*'([^']*)'/1/")
DATA








=
$(filter‐out
$(wildcard
sql/*‐‐*.sql),$
(wildcard
sql/*.sql))
DOCS








=
$(wildcard
doc/*.txt)
TESTS







=
$(wildcard
test/sql/*.sql)
REGRESS





=
$(patsubst
test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS
=
‐‐inputdir=test
MODULES





=
$(patsubst
%.c,%,$(wildcard
src/*.c))

PG_CONFIG



=
pg_config
PG91

=
$(shell
$(PG_CONFIG)
‐‐version



|
grep
‐qE
"
8.|
9.0"
&&
echo
no
||
echo
yes)

 Makefile
Update the Makefile
PG91

=
$(shell
$(PG_CONFIG)
‐‐version



|
grep
‐qE
"
8.|
9.0"
&&
echo
no
||
echo
yes)




 Makefile
Update the Makefile
PG91

=
$(shell
$(PG_CONFIG)
‐‐version



|
grep
‐qE
"
8.|
9.0"
&&
echo
no
||
echo
yes)

ifeq
($(PG91),yes)
all:
sql/$(EXTENSION)‐‐$(EXTVERSION).sql

sql/$(EXTENSION)‐‐$(EXTVERSION).sql:
sql/$(EXTENSION).sql

 cp
$<
$@

DATA
=
$(wildcard
sql/*‐‐*.sql)
sql/$(EXTENSION)‐‐$
(EXTVERSION).sql
EXTRA_CLEAN
=
sql/$(EXTENSION)‐‐$(EXTVERSION).sql
endif

PGXS
:=
$(shell
$(PG_CONFIG)
‐‐pgxs)
include
$(PGXS)
 Makefile
Update the Makefile
PG91

=
$(shell
$(PG_CONFIG)
‐‐version



|
grep
‐qE
"
8.|
9.0"
&&
echo
no
||
echo
yes)

ifeq
($(PG91),yes)
all:
sql/$(EXTENSION)‐‐$(EXTVERSION).sql

sql/$(EXTENSION)‐‐$(EXTVERSION).sql:
sql/$(EXTENSION).sql

 cp
$<
$@

DATA
=
$(wildcard
sql/*‐‐*.sql)
sql/$(EXTENSION)‐‐$
(EXTVERSION).sql
EXTRA_CLEAN
=
sql/$(EXTENSION)‐‐$(EXTVERSION).sql
endif

PGXS
:=
$(shell
$(PG_CONFIG)
‐‐pgxs)
include
$(PGXS)
 Makefile
Update the Makefile
PG91

=
$(shell
$(PG_CONFIG)
‐‐version



|
grep
‐qE
"
8.|
9.0"
&&
echo
no
||
echo
yes)

ifeq
($(PG91),yes)
all:
sql/$(EXTENSION)‐‐$(EXTVERSION).sql

sql/$(EXTENSION)‐‐$(EXTVERSION).sql:
sql/$(EXTENSION).sql

 cp
$<
$@

DATA
=
$(wildcard
sql/*‐‐*.sql)
sql/$(EXTENSION)‐‐$
(EXTVERSION).sql
EXTRA_CLEAN
=
sql/$(EXTENSION)‐‐$(EXTVERSION).sql
endif

PGXS
:=
$(shell
$(PG_CONFIG)
‐‐pgxs)
include
$(PGXS)
 Makefile
Update the Makefile
PG91

=
$(shell
$(PG_CONFIG)
‐‐version



|
grep
‐qE
"
8.|
9.0"
&&
echo
no
||
echo
yes)

ifeq
($(PG91),yes)
all:
sql/$(EXTENSION)‐‐$(EXTVERSION).sql

sql/$(EXTENSION)‐‐$(EXTVERSION).sql:
sql/$(EXTENSION).sql

 cp
$<
$@

DATA
=
$(wildcard
sql/*‐‐*.sql)
sql/$(EXTENSION)‐‐$
(EXTVERSION).sql
EXTRA_CLEAN
=
sql/$(EXTENSION)‐‐$(EXTVERSION).sql
endif

PGXS
:=
$(shell
$(PG_CONFIG)
‐‐pgxs)
include
$(PGXS)
 Makefile
Update the Makefile
PG91

=
$(shell
$(PG_CONFIG)
‐‐version



|
grep
‐qE
"
8.|
9.0"
&&
echo
no
||
echo
yes)

ifeq
($(PG91),yes)
all:
sql/$(EXTENSION)‐‐$(EXTVERSION).sql

sql/$(EXTENSION)‐‐$(EXTVERSION).sql:
sql/$(EXTENSION).sql

 cp
$<
$@

DATA
=
$(wildcard
sql/*‐‐*.sql)
sql/$(EXTENSION)‐‐$
(EXTVERSION).sql
EXTRA_CLEAN
=
sql/$(EXTENSION)‐‐$(EXTVERSION).sql
endif

PGXS
:=
$(shell
$(PG_CONFIG)
‐‐pgxs)
include
$(PGXS)
 Makefile
Update the Makefile
PG91

=
$(shell
$(PG_CONFIG)
‐‐version



|
grep
‐qE
"
8.|
9.0"
&&
echo
no
||
echo
yes)

ifeq
($(PG91),yes)
all:
sql/$(EXTENSION)‐‐$(EXTVERSION).sql

sql/$(EXTENSION)‐‐$(EXTVERSION).sql:
sql/$(EXTENSION).sql

 cp
$<
$@

DATA
=
$(wildcard
sql/*‐‐*.sql)
sql/$(EXTENSION)‐‐$
(EXTVERSION).sql
EXTRA_CLEAN
=
sql/$(EXTENSION)‐‐$(EXTVERSION).sql
endif

PGXS
:=
$(shell
$(PG_CONFIG)
‐‐pgxs)
include
$(PGXS)
 Makefile
Update the Makefile
PG91

=
$(shell
$(PG_CONFIG)
‐‐version



|
grep
‐qE
"
8.|
9.0"
&&
echo
no
||
echo
yes)

ifeq
($(PG91),yes)
all:
sql/$(EXTENSION)‐‐$(EXTVERSION).sql

sql/$(EXTENSION)‐‐$(EXTVERSION).sql:
sql/$(EXTENSION).sql

 cp
$<
$@

DATA
=
$(wildcard
sql/*‐‐*.sql)
sql/$(EXTENSION)‐‐$
(EXTVERSION).sql
EXTRA_CLEAN
=
sql/$(EXTENSION)‐‐$(EXTVERSION).sql
endif

PGXS
:=
$(shell
$(PG_CONFIG)
‐‐pgxs)
include
$(PGXS)
 Makefile
Update the Makefile
PG91

=
$(shell
$(PG_CONFIG)
‐‐version



|
grep
‐qE
"
8.|
9.0"
&&
echo
no
||
echo
yes)

ifeq
($(PG91),yes)
all:
sql/$(EXTENSION)‐‐$(EXTVERSION).sql

sql/$(EXTENSION)‐‐$(EXTVERSION).sql:
sql/$(EXTENSION).sql

 cp
$<
$@

DATA
=
$(wildcard
sql/*‐‐*.sql)
sql/$(EXTENSION)‐‐$
(EXTVERSION).sql
EXTRA_CLEAN
=
sql/$(EXTENSION)‐‐$(EXTVERSION).sql
endif

PGXS
:=
$(shell
$(PG_CONFIG)
‐‐pgxs)
include
$(PGXS)
 Makefile
Or Forget It
Or Forget It
Copy Makefile
Or Forget It
Copy Makefile

Edit first line
Or Forget It
Copy Makefile

Edit first line

   EXTENSION=pair
Or Forget It
Copy Makefile

Edit first line

   EXTENSION=pair

Ignore the rest
%
curl
‐O
http://api.pgxn.org/dist/pair/0.1.2/pair‐0.1.2.pgz
%
unzip
pair‐0.1.2.pgz

Archive:

pair‐0.1.2.pgz
%
cd
pair‐0.1.2
%
%
curl
‐O
http://api.pgxn.org/dist/pair/0.1.2/pair‐0.1.2.pgz
%
unzip
pair‐0.1.2.pgz

Archive:

pair‐0.1.2.pgz
%
cd
pair‐0.1.2


%
make
cp
sql/pair.sql
sql/pair‐‐0.1.2.sql
cp
sql/pair‐‐unpackaged.sql
sql/pair‐‐unpackaged‐‐0.1.2.sql
%
sudo
make
install
#
…elided
%
%
curl
‐O
http://api.pgxn.org/dist/pair/0.1.2/pair‐0.1.2.pgz
%
unzip
pair‐0.1.2.pgz

Archive:

pair‐0.1.2.pgz
%
cd
pair‐0.1.2


%
make
cp
sql/pair.sql
sql/pair‐‐0.1.2.sql
cp
sql/pair‐‐unpackaged.sql
sql/pair‐‐unpackaged‐‐0.1.2.sql
%
sudo
make
install
#
…elided


%
psql
try
psql
(9.1devel)
Type
"help"
for
help.

try=#
create
extension
pair;
CREATE
EXTENSION
try=#

%
curl
‐O
http://api.pgxn.org/dist/pair/0.1.2/pair‐0.1.2.pgz
%
unzip
pair‐0.1.2.pgz

Archive:

pair‐0.1.2.pgz
%
cd
pair‐0.1.2


%
make
cp
sql/pair.sql
sql/pair‐‐0.1.2.sql
cp
sql/pair‐‐unpackaged.sql
sql/pair‐‐unpackaged‐‐0.1.2.sql
%
sudo
make
install
#
…elided


%
psql
try
psql
(9.1devel)
Type
"help"
for
help.

try=#
create
extension
pair;
CREATE
EXTENSION






dT
try=#






List
of
data
types

Schema
|
Name
|
Description

‐‐‐‐‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐

public
|
pair
|

(1
row)

try=#

%
curl
‐O
http://api.pgxn.org/dist/pair/0.1.2/pair‐0.1.2.pgz
%
unzip
pair‐0.1.2.pgz

Archive:

pair‐0.1.2.pgz
%
cd
pair‐0.1.2


%
make
cp
sql/pair.sql
sql/pair‐‐0.1.2.sql
cp
sql/pair‐‐unpackaged.sql
sql/pair‐‐unpackaged‐‐0.1.2.sql
%
sudo
make
install
#
…elided


%
psql
try
psql
(9.1devel)
Type
"help"
for
help.

try=#
create
extension
pair;
CREATE
EXTENSION






dT
try=#






List
of
data
types

Schema
|
Name
|
Description

‐‐‐‐‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐

public
|
pair
|

(1
row)

try=#

                                         Wow!
Thank you.
                Releasing Extensions
                      on PGXN
                                               David E. Wheeler
                                            PostgreSQL Experts, Inc.

Text: Attribution-Noncommercial-Share Alike 3.0 United States:
http://creativecommons.org/licenses/by-nc-sa/3.0/us/
Images licensed independently and © Their respective owners.

More Related Content

What's hot

What's hot (6)

Redis
RedisRedis
Redis
 
Hacking Lucene for Custom Search Results
Hacking Lucene for Custom Search ResultsHacking Lucene for Custom Search Results
Hacking Lucene for Custom Search Results
 
Web Integration Patterns in the Era of HTML5
Web Integration Patterns in the Era of HTML5Web Integration Patterns in the Era of HTML5
Web Integration Patterns in the Era of HTML5
 
Berlin Buzzwords 2013 - How does lucene store your data?
Berlin Buzzwords 2013 - How does lucene store your data?Berlin Buzzwords 2013 - How does lucene store your data?
Berlin Buzzwords 2013 - How does lucene store your data?
 
Pg 95 new capabilities
Pg 95 new capabilitiesPg 95 new capabilities
Pg 95 new capabilities
 
Grokking the REST Architectural Style
Grokking the REST Architectural StyleGrokking the REST Architectural Style
Grokking the REST Architectural Style
 

Viewers also liked

Sane SQL Change Management with Sqitch
Sane SQL Change Management with SqitchSane SQL Change Management with Sqitch
Sane SQL Change Management with Sqitch
David Wheeler
 

Viewers also liked (7)

Building and Distributing PostgreSQL Extensions Without Learning C
Building and Distributing PostgreSQL Extensions Without Learning CBuilding and Distributing PostgreSQL Extensions Without Learning C
Building and Distributing PostgreSQL Extensions Without Learning C
 
Test Driven Database Development
Test Driven Database DevelopmentTest Driven Database Development
Test Driven Database Development
 
Building and Distributing PostgreSQL Extensions Without Learning C
Building and Distributing PostgreSQL Extensions Without Learning CBuilding and Distributing PostgreSQL Extensions Without Learning C
Building and Distributing PostgreSQL Extensions Without Learning C
 
Simple SQL Change Management with Sqitch
Simple SQL Change Management with SqitchSimple SQL Change Management with Sqitch
Simple SQL Change Management with Sqitch
 
Sane SQL Change Management with Sqitch
Sane SQL Change Management with SqitchSane SQL Change Management with Sqitch
Sane SQL Change Management with Sqitch
 
PgTAP Best Practices
PgTAP Best PracticesPgTAP Best Practices
PgTAP Best Practices
 
Unit Test Your Database
Unit Test Your DatabaseUnit Test Your Database
Unit Test Your Database
 

Similar to Releasing PostgreSQL Extension on PGXN

Ejb3 Struts Tutorial En
Ejb3 Struts Tutorial EnEjb3 Struts Tutorial En
Ejb3 Struts Tutorial En
Ankur Dongre
 
Ejb3 Struts Tutorial En
Ejb3 Struts Tutorial EnEjb3 Struts Tutorial En
Ejb3 Struts Tutorial En
Ankur Dongre
 
Generating Linked Data descriptions of Debian packages in the Debian PTS
Generating Linked Data descriptions of Debian packages in the Debian PTSGenerating Linked Data descriptions of Debian packages in the Debian PTS
Generating Linked Data descriptions of Debian packages in the Debian PTS
olberger
 
Puppet DSL gotchas, and understandiing Roles & Profiles pattern
Puppet DSL gotchas, and understandiing Roles & Profiles patternPuppet DSL gotchas, and understandiing Roles & Profiles pattern
Puppet DSL gotchas, and understandiing Roles & Profiles pattern
Alex Simenduev
 

Similar to Releasing PostgreSQL Extension on PGXN (20)

Package.json ( NodeJS )
Package.json ( NodeJS )Package.json ( NodeJS )
Package.json ( NodeJS )
 
Package.json
Package.jsonPackage.json
Package.json
 
Language-agnostic data analysis workflows and reproducible research
Language-agnostic data analysis workflows and reproducible researchLanguage-agnostic data analysis workflows and reproducible research
Language-agnostic data analysis workflows and reproducible research
 
Describing configurations of software experiments as Linked Data
Describing configurations of software experiments as Linked DataDescribing configurations of software experiments as Linked Data
Describing configurations of software experiments as Linked Data
 
Change Data Capture (CDC) With Kafka Connect® and the Debezium PostgreSQL Sou...
Change Data Capture (CDC) With Kafka Connect® and the Debezium PostgreSQL Sou...Change Data Capture (CDC) With Kafka Connect® and the Debezium PostgreSQL Sou...
Change Data Capture (CDC) With Kafka Connect® and the Debezium PostgreSQL Sou...
 
DockerCon EU 2015: Shipping Manifests, Bill of Lading and Docker Metadata and...
DockerCon EU 2015: Shipping Manifests, Bill of Lading and Docker Metadata and...DockerCon EU 2015: Shipping Manifests, Bill of Lading and Docker Metadata and...
DockerCon EU 2015: Shipping Manifests, Bill of Lading and Docker Metadata and...
 
EKAW - Publishing with Triple Pattern Fragments
EKAW - Publishing with Triple Pattern FragmentsEKAW - Publishing with Triple Pattern Fragments
EKAW - Publishing with Triple Pattern Fragments
 
postgres loader
postgres loaderpostgres loader
postgres loader
 
Devtools cheatsheet
Devtools cheatsheetDevtools cheatsheet
Devtools cheatsheet
 
Devtools cheatsheet
Devtools cheatsheetDevtools cheatsheet
Devtools cheatsheet
 
Ejb3 Struts Tutorial En
Ejb3 Struts Tutorial EnEjb3 Struts Tutorial En
Ejb3 Struts Tutorial En
 
Ejb3 Struts Tutorial En
Ejb3 Struts Tutorial EnEjb3 Struts Tutorial En
Ejb3 Struts Tutorial En
 
Continuous Deployment @ AWS Re:Invent
Continuous Deployment @ AWS Re:InventContinuous Deployment @ AWS Re:Invent
Continuous Deployment @ AWS Re:Invent
 
Continuous Integration and Deployment Best Practices on AWS (ARC307) | AWS re...
Continuous Integration and Deployment Best Practices on AWS (ARC307) | AWS re...Continuous Integration and Deployment Best Practices on AWS (ARC307) | AWS re...
Continuous Integration and Deployment Best Practices on AWS (ARC307) | AWS re...
 
Generating Linked Data descriptions of Debian packages in the Debian PTS
Generating Linked Data descriptions of Debian packages in the Debian PTSGenerating Linked Data descriptions of Debian packages in the Debian PTS
Generating Linked Data descriptions of Debian packages in the Debian PTS
 
Idiomatic gradle plugin writing
Idiomatic gradle plugin writingIdiomatic gradle plugin writing
Idiomatic gradle plugin writing
 
Puppet DSL gotchas, and understandiing Roles & Profiles pattern
Puppet DSL gotchas, and understandiing Roles & Profiles patternPuppet DSL gotchas, and understandiing Roles & Profiles pattern
Puppet DSL gotchas, and understandiing Roles & Profiles pattern
 
PharoDAYS 2015: Publishing libraries and frameworks by Sven Van Caekenberghe
PharoDAYS 2015: Publishing libraries and frameworks by Sven Van CaekenberghePharoDAYS 2015: Publishing libraries and frameworks by Sven Van Caekenberghe
PharoDAYS 2015: Publishing libraries and frameworks by Sven Van Caekenberghe
 
tutorial2-notes2
tutorial2-notes2tutorial2-notes2
tutorial2-notes2
 
tutorial2-notes2
tutorial2-notes2tutorial2-notes2
tutorial2-notes2
 

Recently uploaded

Recently uploaded (20)

presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 

Releasing PostgreSQL Extension on PGXN

Editor's Notes

  1. TODO:\n&amp;#x2022; Add more privilege stuff?\n&amp;#x2022; Add example of renaming `flips.timestamp`?\n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. \n
  131. \n
  132. \n
  133. \n
  134. \n
  135. \n
  136. \n
  137. \n
  138. \n
  139. \n
  140. \n
  141. \n
  142. \n
  143. \n
  144. \n
  145. \n
  146. \n
  147. \n
  148. \n
  149. \n
  150. \n
  151. \n
  152. \n
  153. \n
  154. \n
  155. \n
  156. \n
  157. \n
  158. \n
  159. \n
  160. \n
  161. \n
  162. \n
  163. \n
  164. \n
  165. \n
  166. \n
  167. \n
  168. \n
  169. \n
  170. \n
  171. \n
  172. \n
  173. \n
  174. \n
  175. \n
  176. \n
  177. \n
  178. \n
  179. \n
  180. \n
  181. \n
  182. \n
  183. \n
  184. \n
  185. \n
  186. \n
  187. \n
  188. \n
  189. \n
  190. \n
  191. \n
  192. \n
  193. \n
  194. \n
  195. \n
  196. \n
  197. \n
  198. \n
  199. \n
  200. \n
  201. \n
  202. \n
  203. \n
  204. \n
  205. \n
  206. \n
  207. \n
  208. \n
  209. \n
  210. \n
  211. \n
  212. \n
  213. \n
  214. TODO:\n&amp;#x2022; Add more privilege stuff?\n&amp;#x2022; Add example of renaming `flips.timestamp`?\n