</row>
<row>
- <entry><structfield>seqcycle</structfield></entry>
- <entry><type>bool</type></entry>
+ <entry><structfield>seqtypid</structfield></entry>
+ <entry><type>oid</type></entry>
+ <entry><literal><link linkend="catalog-pg-type"><structname>pg_type</structname></link>.oid</literal></entry>
<entry></entry>
- <entry>Whether the sequence cycles</entry>
+ <entry>Data type of the sequence</entry>
</row>
<row>
<entry></entry>
<entry>Cache size of the sequence</entry>
</row>
+
+ <row>
+ <entry><structfield>seqcycle</structfield></entry>
+ <entry><type>bool</type></entry>
+ <entry></entry>
+ <entry>Whether the sequence cycles</entry>
+ </row>
</tbody>
</tgroup>
</table>
<entry><literal><link linkend="catalog-pg-authid"><structname>pg_authid</structname></link>.rolname</literal></entry>
<entry>Name of sequence's owner</entry>
</row>
+ <row>
+ <entry><structfield>data_type</structfield></entry>
+ <entry><type>regtype</type></entry>
+ <entry><literal><link linkend="catalog-pg-authid"><structname>pg_type</structname></link>.oid</literal></entry>
+ <entry>Data type of the sequence</entry>
+ </row>
<row>
<entry><structfield>start_value</structfield></entry>
<entry><type>bigint</type></entry>
<entry><literal>data_type</literal></entry>
<entry><type>character_data</type></entry>
<entry>
- The data type of the sequence. In
- <productname>PostgreSQL</productname>, this is currently always
- <literal>bigint</literal>.
+ The data type of the sequence.
</entry>
</row>
<refsynopsisdiv>
<synopsis>
-ALTER SEQUENCE [ IF EXISTS ] <replaceable class="parameter">name</replaceable> [ INCREMENT [ BY ] <replaceable class="parameter">increment</replaceable> ]
+ALTER SEQUENCE [ IF EXISTS ] <replaceable class="parameter">name</replaceable>
+ [ AS <replaceable class="parameter">data_type</replaceable> ]
+ [ INCREMENT [ BY ] <replaceable class="parameter">increment</replaceable> ]
[ MINVALUE <replaceable class="parameter">minvalue</replaceable> | NO MINVALUE ] [ MAXVALUE <replaceable class="parameter">maxvalue</replaceable> | NO MAXVALUE ]
[ START [ WITH ] <replaceable class="parameter">start</replaceable> ]
[ RESTART [ [ WITH ] <replaceable class="parameter">restart</replaceable> ] ]
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><replaceable class="parameter">data_type</replaceable></term>
+ <listitem>
+ <para>
+ The optional
+ clause <literal>AS <replaceable class="parameter">data_type</replaceable></literal>
+ changes the data type of the sequence. Valid types are
+ are <literal>smallint</literal>, <literal>integer</literal>,
+ and <literal>bigint</literal>.
+ </para>
+
+ <para>
+ Note that changing the data type does not automatically change the
+ minimum and maximum values. You can use the clauses <literal>NO
+ MINVALUE</literal> and <literal>NO MAXVALUE</literal> to adjust the
+ minimum and maximum values to the range of the new data type.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry>
<term><replaceable class="parameter">increment</replaceable></term>
<listitem>
class="parameter">minvalue</replaceable></literal> determines
the minimum value a sequence can generate. If <literal>NO
MINVALUE</literal> is specified, the defaults of 1 and
- -2<superscript>63</> for ascending and descending sequences,
+ the minimum value of the data type for ascending and descending sequences,
respectively, will be used. If neither option is specified,
the current minimum value will be maintained.
</para>
class="parameter">maxvalue</replaceable></literal> determines
the maximum value for the sequence. If <literal>NO
MAXVALUE</literal> is specified, the defaults of
- 2<superscript>63</>-1 and -1 for ascending and descending
+ the maximum value of the data type and -1 for ascending and descending
sequences, respectively, will be used. If neither option is
specified, the current maximum value will be maintained.
</para>
<para>
<command>ALTER SEQUENCE</command> conforms to the <acronym>SQL</acronym>
- standard, except for the <literal>START WITH</>,
+ standard, except for the <literal>AS</literal>, <literal>START WITH</>,
<literal>OWNED BY</>, <literal>OWNER TO</>, <literal>RENAME TO</>, and
<literal>SET SCHEMA</literal> clauses, which are
<productname>PostgreSQL</productname> extensions.
<refsynopsisdiv>
<synopsis>
-CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] <replaceable class="parameter">name</replaceable> [ INCREMENT [ BY ] <replaceable class="parameter">increment</replaceable> ]
+CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] <replaceable class="parameter">name</replaceable>
+ [ AS <replaceable class="parameter">data_type</replaceable> ]
+ [ INCREMENT [ BY ] <replaceable class="parameter">increment</replaceable> ]
[ MINVALUE <replaceable class="parameter">minvalue</replaceable> | NO MINVALUE ] [ MAXVALUE <replaceable class="parameter">maxvalue</replaceable> | NO MAXVALUE ]
[ START [ WITH ] <replaceable class="parameter">start</replaceable> ] [ CACHE <replaceable class="parameter">cache</replaceable> ] [ [ NO ] CYCLE ]
[ OWNED BY { <replaceable class="parameter">table_name</replaceable>.<replaceable class="parameter">column_name</replaceable> | NONE } ]
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><replaceable class="parameter">data_type</replaceable></term>
+ <listitem>
+ <para>
+ The optional
+ clause <literal>AS <replaceable class="parameter">data_type</replaceable></literal>
+ specifies the data type of the sequence. Valid types are
+ are <literal>smallint</literal>, <literal>integer</literal>,
+ and <literal>bigint</literal>. <literal>bigint</literal> is the
+ default. The data type determines the default minimum and maximum
+ values of the sequence.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry>
<term><replaceable class="parameter">increment</replaceable></term>
<listitem>
class="parameter">minvalue</replaceable></literal> determines
the minimum value a sequence can generate. If this clause is not
supplied or <option>NO MINVALUE</option> is specified, then
- defaults will be used. The defaults are 1 and
- -2<superscript>63</> for ascending and descending sequences,
- respectively.
+ defaults will be used. The default for an ascending sequence is 1. The
+ default for a descending sequence is the minimum value of the data type.
</para>
</listitem>
</varlistentry>
class="parameter">maxvalue</replaceable></literal> determines
the maximum value for the sequence. If this clause is not
supplied or <option>NO MAXVALUE</option> is specified, then
- default values will be used. The defaults are
- 2<superscript>63</>-1 and -1 for ascending and descending
- sequences, respectively.
+ default values will be used. The default for an ascending sequence is
+ the maximum value of the data type. The default for a descending
+ sequence is -1.
</para>
</listitem>
</varlistentry>
<command>CREATE SEQUENCE</command> conforms to the <acronym>SQL</acronym>
standard, with the following exceptions:
<itemizedlist>
- <listitem>
- <para>
- The standard's <literal>AS <replaceable>data_type</></literal> expression is not
- supported.
- </para>
- </listitem>
<listitem>
<para>
Obtaining the next value is done using the <function>nextval()</>
SELECT CAST(current_database() AS sql_identifier) AS sequence_catalog,
CAST(nc.nspname AS sql_identifier) AS sequence_schema,
CAST(c.relname AS sql_identifier) AS sequence_name,
- CAST('bigint' AS character_data) AS data_type,
- CAST(64 AS cardinal_number) AS numeric_precision,
+ CAST(format_type(s.seqtypid, null) AS character_data) AS data_type,
+ CAST(_pg_numeric_precision(s.seqtypid, -1) AS cardinal_number) AS numeric_precision,
CAST(2 AS cardinal_number) AS numeric_precision_radix,
CAST(0 AS cardinal_number) AS numeric_scale,
CAST(s.seqstart AS character_data) AS start_value,
N.nspname AS schemaname,
C.relname AS sequencename,
pg_get_userbyid(C.relowner) AS sequenceowner,
+ S.seqtypid::regtype AS data_type,
S.seqstart AS start_value,
S.seqmin AS min_value,
S.seqmax AS max_value,
#include "funcapi.h"
#include "miscadmin.h"
#include "nodes/makefuncs.h"
+#include "parser/parse_type.h"
#include "storage/lmgr.h"
#include "storage/proc.h"
#include "storage/smgr.h"
memset(pgs_nulls, 0, sizeof(pgs_nulls));
pgs_values[Anum_pg_sequence_seqrelid - 1] = ObjectIdGetDatum(seqoid);
- pgs_values[Anum_pg_sequence_seqcycle - 1] = BoolGetDatum(seqform.seqcycle);
+ pgs_values[Anum_pg_sequence_seqtypid - 1] = ObjectIdGetDatum(seqform.seqtypid);
pgs_values[Anum_pg_sequence_seqstart - 1] = Int64GetDatumFast(seqform.seqstart);
pgs_values[Anum_pg_sequence_seqincrement - 1] = Int64GetDatumFast(seqform.seqincrement);
pgs_values[Anum_pg_sequence_seqmax - 1] = Int64GetDatumFast(seqform.seqmax);
pgs_values[Anum_pg_sequence_seqmin - 1] = Int64GetDatumFast(seqform.seqmin);
pgs_values[Anum_pg_sequence_seqcache - 1] = Int64GetDatumFast(seqform.seqcache);
+ pgs_values[Anum_pg_sequence_seqcycle - 1] = BoolGetDatum(seqform.seqcycle);
tuple = heap_form_tuple(tupDesc, pgs_values, pgs_nulls);
CatalogTupleInsert(rel, tuple);
if (!HeapTupleIsValid(pgstuple))
elog(ERROR, "cache lookup failed for sequence %u", relid);
pgsform = (Form_pg_sequence) GETSTRUCT(pgstuple);
- cycle = pgsform->seqcycle;
incby = pgsform->seqincrement;
maxv = pgsform->seqmax;
minv = pgsform->seqmin;
cache = pgsform->seqcache;
+ cycle = pgsform->seqcycle;
ReleaseSysCache(pgstuple);
/* lock page' buffer and read tuple */
Form_pg_sequence seqform,
Form_pg_sequence_data seqdataform, List **owned_by)
{
+ DefElem *as_type = NULL;
DefElem *start_value = NULL;
DefElem *restart_value = NULL;
DefElem *increment_by = NULL;
{
DefElem *defel = (DefElem *) lfirst(option);
- if (strcmp(defel->defname, "increment") == 0)
+ if (strcmp(defel->defname, "as") == 0)
+ {
+ if (as_type)
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("conflicting or redundant options"),
+ parser_errposition(pstate, defel->location)));
+ as_type = defel;
+ }
+ else if (strcmp(defel->defname, "increment") == 0)
{
if (increment_by)
ereport(ERROR,
if (isInit)
seqdataform->log_cnt = 0;
+ /* AS type */
+ if (as_type != NULL)
+ {
+ seqform->seqtypid = typenameTypeId(pstate, defGetTypeName(as_type));
+ if (seqform->seqtypid != INT2OID &&
+ seqform->seqtypid != INT4OID &&
+ seqform->seqtypid != INT8OID)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("sequence type must be smallint, integer, or bigint")));
+ }
+ else if (isInit)
+ seqform->seqtypid = INT8OID;
+
/* INCREMENT BY */
if (increment_by != NULL)
{
else if (isInit || max_value != NULL)
{
if (seqform->seqincrement > 0)
- seqform->seqmax = PG_INT64_MAX; /* ascending seq */
+ {
+ /* ascending seq */
+ if (seqform->seqtypid == INT2OID)
+ seqform->seqmax = PG_INT16_MAX;
+ else if (seqform->seqtypid == INT4OID)
+ seqform->seqmax = PG_INT32_MAX;
+ else
+ seqform->seqmax = PG_INT64_MAX;
+ }
else
seqform->seqmax = -1; /* descending seq */
seqdataform->log_cnt = 0;
}
+ if ((seqform->seqtypid == INT2OID && (seqform->seqmax < PG_INT16_MIN || seqform->seqmax > PG_INT16_MAX))
+ || (seqform->seqtypid == INT4OID && (seqform->seqmax < PG_INT32_MIN || seqform->seqmax > PG_INT32_MAX))
+ || (seqform->seqtypid == INT8OID && (seqform->seqmax < PG_INT64_MIN || seqform->seqmax > PG_INT64_MAX)))
+ {
+ char bufx[100];
+
+ snprintf(bufx, sizeof(bufx), INT64_FORMAT, seqform->seqmax);
+
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("MAXVALUE (%s) is out of range for sequence data type %s",
+ bufx, format_type_be(seqform->seqtypid))));
+ }
+
/* MINVALUE (null arg means NO MINVALUE) */
if (min_value != NULL && min_value->arg)
{
if (seqform->seqincrement > 0)
seqform->seqmin = 1; /* ascending seq */
else
- seqform->seqmin = PG_INT64_MIN; /* descending seq */
+ {
+ /* descending seq */
+ if (seqform->seqtypid == INT2OID)
+ seqform->seqmin = PG_INT16_MIN;
+ else if (seqform->seqtypid == INT4OID)
+ seqform->seqmin = PG_INT32_MIN;
+ else
+ seqform->seqmin = PG_INT64_MIN;
+ }
seqdataform->log_cnt = 0;
}
+ if ((seqform->seqtypid == INT2OID && (seqform->seqmin < PG_INT16_MIN || seqform->seqmin > PG_INT16_MAX))
+ || (seqform->seqtypid == INT4OID && (seqform->seqmin < PG_INT32_MIN || seqform->seqmin > PG_INT32_MAX))
+ || (seqform->seqtypid == INT8OID && (seqform->seqmin < PG_INT64_MIN || seqform->seqmin > PG_INT64_MAX)))
+ {
+ char bufm[100];
+
+ snprintf(bufm, sizeof(bufm), INT64_FORMAT, seqform->seqmin);
+
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("MINVALUE (%s) is out of range for sequence data type %s",
+ bufm, format_type_be(seqform->seqtypid))));
+ }
+
/* crosscheck min/max */
if (seqform->seqmin >= seqform->seqmax)
{
{
Oid relid = PG_GETARG_OID(0);
TupleDesc tupdesc;
- Datum values[6];
- bool isnull[6];
+ Datum values[7];
+ bool isnull[7];
HeapTuple pgstuple;
Form_pg_sequence pgsform;
errmsg("permission denied for sequence %s",
get_rel_name(relid))));
- tupdesc = CreateTemplateTupleDesc(6, false);
+ tupdesc = CreateTemplateTupleDesc(7, false);
TupleDescInitEntry(tupdesc, (AttrNumber) 1, "start_value",
INT8OID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber) 2, "minimum_value",
BOOLOID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber) 6, "cache_size",
INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 7, "data_type",
+ OIDOID, -1, 0);
BlessTupleDesc(tupdesc);
values[3] = Int64GetDatum(pgsform->seqincrement);
values[4] = BoolGetDatum(pgsform->seqcycle);
values[5] = Int64GetDatum(pgsform->seqcache);
+ values[6] = ObjectIdGetDatum(pgsform->seqtypid);
ReleaseSysCache(pgstuple);
| SeqOptList SeqOptElem { $$ = lappend($1, $2); }
;
-SeqOptElem: CACHE NumericOnly
+SeqOptElem: AS SimpleTypename
+ {
+ $$ = makeDefElem("as", (Node *)$2, @1);
+ }
+ | CACHE NumericOnly
{
$$ = makeDefElem("cache", (Node *)$2, @1);
}
*/
seqstmt = makeNode(CreateSeqStmt);
seqstmt->sequence = makeRangeVar(snamespace, sname, -1);
- seqstmt->options = NIL;
+ seqstmt->options = list_make1(makeDefElem("as", (Node *) makeTypeNameFromOid(column->typeName->typeOid, -1), -1));
/*
* If this is ALTER ADD COLUMN, make sure the sequence will be owned
PGresult *res;
char *startv,
*incby,
- *maxv = NULL,
- *minv = NULL,
- *cache;
- char bufm[100],
- bufx[100];
+ *maxv,
+ *minv,
+ *cache,
+ *seqtype;
bool cycled;
+ bool is_ascending;
PQExpBuffer query = createPQExpBuffer();
PQExpBuffer delqry = createPQExpBuffer();
PQExpBuffer labelq = createPQExpBuffer();
- snprintf(bufm, sizeof(bufm), INT64_FORMAT, PG_INT64_MIN);
- snprintf(bufx, sizeof(bufx), INT64_FORMAT, PG_INT64_MAX);
-
if (fout->remoteVersion >= 100000)
{
/* Make sure we are in proper schema */
selectSourceSchema(fout, "pg_catalog");
appendPQExpBuffer(query,
- "SELECT seqstart, seqincrement, "
- "CASE WHEN seqincrement > 0 AND seqmax = %s THEN NULL "
- " WHEN seqincrement < 0 AND seqmax = -1 THEN NULL "
- " ELSE seqmax "
- "END AS seqmax, "
- "CASE WHEN seqincrement > 0 AND seqmin = 1 THEN NULL "
- " WHEN seqincrement < 0 AND seqmin = %s THEN NULL "
- " ELSE seqmin "
- "END AS seqmin, "
+ "SELECT format_type(seqtypid, NULL), "
+ "seqstart, seqincrement, "
+ "seqmax, seqmin, "
"seqcache, seqcycle "
"FROM pg_class c "
"JOIN pg_sequence s ON (s.seqrelid = c.oid) "
"WHERE c.oid = '%u'::oid",
- bufx, bufm,
tbinfo->dobj.catId.oid);
}
else if (fout->remoteVersion >= 80400)
selectSourceSchema(fout, tbinfo->dobj.namespace->dobj.name);
appendPQExpBuffer(query,
- "SELECT start_value, increment_by, "
- "CASE WHEN increment_by > 0 AND max_value = %s THEN NULL "
- " WHEN increment_by < 0 AND max_value = -1 THEN NULL "
- " ELSE max_value "
- "END AS max_value, "
- "CASE WHEN increment_by > 0 AND min_value = 1 THEN NULL "
- " WHEN increment_by < 0 AND min_value = %s THEN NULL "
- " ELSE min_value "
- "END AS min_value, "
+ "SELECT 'bigint'::name AS sequence_type, "
+ "start_value, increment_by, max_value, min_value, "
"cache_value, is_cycled FROM %s",
- bufx, bufm,
fmtId(tbinfo->dobj.name));
}
else
selectSourceSchema(fout, tbinfo->dobj.namespace->dobj.name);
appendPQExpBuffer(query,
- "SELECT 0 AS start_value, increment_by, "
- "CASE WHEN increment_by > 0 AND max_value = %s THEN NULL "
- " WHEN increment_by < 0 AND max_value = -1 THEN NULL "
- " ELSE max_value "
- "END AS max_value, "
- "CASE WHEN increment_by > 0 AND min_value = 1 THEN NULL "
- " WHEN increment_by < 0 AND min_value = %s THEN NULL "
- " ELSE min_value "
- "END AS min_value, "
+ "SELECT 'bigint'::name AS sequence_type, "
+ "0 AS start_value, increment_by, max_value, min_value, "
"cache_value, is_cycled FROM %s",
- bufx, bufm,
fmtId(tbinfo->dobj.name));
}
exit_nicely(1);
}
- startv = PQgetvalue(res, 0, 0);
- incby = PQgetvalue(res, 0, 1);
- if (!PQgetisnull(res, 0, 2))
- maxv = PQgetvalue(res, 0, 2);
- if (!PQgetisnull(res, 0, 3))
- minv = PQgetvalue(res, 0, 3);
- cache = PQgetvalue(res, 0, 4);
- cycled = (strcmp(PQgetvalue(res, 0, 5), "t") == 0);
+ seqtype = PQgetvalue(res, 0, 0);
+ startv = PQgetvalue(res, 0, 1);
+ incby = PQgetvalue(res, 0, 2);
+ maxv = PQgetvalue(res, 0, 3);
+ minv = PQgetvalue(res, 0, 4);
+ cache = PQgetvalue(res, 0, 5);
+ cycled = (strcmp(PQgetvalue(res, 0, 6), "t") == 0);
+
+ is_ascending = incby[0] != '-';
+
+ if (is_ascending && atoi(minv) == 1)
+ minv = NULL;
+ if (!is_ascending && atoi(maxv) == -1)
+ maxv = NULL;
+
+ if (strcmp(seqtype, "smallint") == 0)
+ {
+ if (!is_ascending && atoi(minv) == PG_INT16_MIN)
+ minv = NULL;
+ if (is_ascending && atoi(maxv) == PG_INT16_MAX)
+ maxv = NULL;
+ }
+ else if (strcmp(seqtype, "integer") == 0)
+ {
+ if (!is_ascending && atoi(minv) == PG_INT32_MIN)
+ minv = NULL;
+ if (is_ascending && atoi(maxv) == PG_INT32_MAX)
+ maxv = NULL;
+ }
+ else if (strcmp(seqtype, "bigint") == 0)
+ {
+ char bufm[100],
+ bufx[100];
+
+ snprintf(bufm, sizeof(bufm), INT64_FORMAT, PG_INT64_MIN);
+ snprintf(bufx, sizeof(bufx), INT64_FORMAT, PG_INT64_MAX);
+
+ if (!is_ascending && strcmp(minv, bufm) == 0)
+ minv = NULL;
+ if (is_ascending && strcmp(maxv, bufx) == 0)
+ maxv = NULL;
+ }
/*
* DROP must be fully qualified in case same name appears in pg_catalog
"CREATE SEQUENCE %s\n",
fmtId(tbinfo->dobj.name));
+ if (strcmp(seqtype, "bigint") != 0)
+ appendPQExpBuffer(query, " AS %s\n", seqtype);
+
if (fout->remoteVersion >= 80400)
appendPQExpBuffer(query, " START WITH %s\n", startv);
catch_all => 'CREATE ... commands',
regexp => qr/^
\QCREATE SEQUENCE test_table_col1_seq\E
+ \n\s+\QAS integer\E
\n\s+\QSTART WITH 1\E
\n\s+\QINCREMENT BY 1\E
\n\s+\QNO MINVALUE\E
catch_all => 'CREATE ... commands',
regexp => qr/^
\QCREATE SEQUENCE test_third_table_col1_seq\E
+ \n\s+\QAS integer\E
\n\s+\QSTART WITH 1\E
\n\s+\QINCREMENT BY 1\E
\n\s+\QNO MINVALUE\E
*/
/* yyyymmddN */
-#define CATALOG_VERSION_NO 201701309
+#define CATALOG_VERSION_NO 201702101
#endif
DESCR("set sequence value");
DATA(insert OID = 1765 ( setval PGNSP PGUID 12 1 0 0 0 f f f f t f v u 3 0 20 "2205 20 16" _null_ _null_ _null_ _null_ _null_ setval3_oid _null_ _null_ _null_ ));
DESCR("set sequence value and is_called status");
-DATA(insert OID = 3078 ( pg_sequence_parameters PGNSP PGUID 12 1 0 0 0 f f f f t f s s 1 0 2249 "26" "{26,20,20,20,20,16,20}" "{i,o,o,o,o,o,o}" "{sequence_oid,start_value,minimum_value,maximum_value,increment,cycle_option,cache_size}" _null_ _null_ pg_sequence_parameters _null_ _null_ _null_));
+DATA(insert OID = 3078 ( pg_sequence_parameters PGNSP PGUID 12 1 0 0 0 f f f f t f s s 1 0 2249 "26" "{26,20,20,20,20,16,20,26}" "{i,o,o,o,o,o,o,o}" "{sequence_oid,start_value,minimum_value,maximum_value,increment,cycle_option,cache_size,data_type}" _null_ _null_ pg_sequence_parameters _null_ _null_ _null_));
DESCR("sequence parameters, for use by information schema");
DATA(insert OID = 4032 ( pg_sequence_last_value PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 20 "2205" _null_ _null_ _null_ _null_ _null_ pg_sequence_last_value _null_ _null_ _null_ ));
DESCR("sequence last value");
CATALOG(pg_sequence,2224) BKI_WITHOUT_OIDS
{
Oid seqrelid;
- bool seqcycle;
+ Oid seqtypid;
int64 seqstart;
int64 seqincrement;
int64 seqmax;
int64 seqmin;
int64 seqcache;
+ bool seqcycle;
} FormData_pg_sequence;
typedef FormData_pg_sequence *Form_pg_sequence;
-#define Natts_pg_sequence 7
+#define Natts_pg_sequence 8
#define Anum_pg_sequence_seqrelid 1
-#define Anum_pg_sequence_seqcycle 2
+#define Anum_pg_sequence_seqtypid 2
#define Anum_pg_sequence_seqstart 3
#define Anum_pg_sequence_seqincrement 4
#define Anum_pg_sequence_seqmax 5
#define Anum_pg_sequence_seqmin 6
#define Anum_pg_sequence_seqcache 7
+#define Anum_pg_sequence_seqcycle 8
#endif /* PG_SEQUENCE_H */
'CREATE SEQUENCE regress_pg_dump_table_col1_seq' => {
regexp => qr/^
\QCREATE SEQUENCE regress_pg_dump_table_col1_seq\E
+ \n\s+\QAS integer\E
\n\s+\QSTART WITH 1\E
\n\s+\QINCREMENT BY 1\E
\n\s+\QNO MINVALUE\E
pg_sequences| SELECT n.nspname AS schemaname,
c.relname AS sequencename,
pg_get_userbyid(c.relowner) AS sequenceowner,
+ (s.seqtypid)::regtype AS data_type,
s.seqstart AS start_value,
s.seqmin AS min_value,
s.seqmax AS max_value,
CREATE SEQUENCE sequence_testx OWNED BY sequence_test_table.b; -- wrong column
ERROR: column "b" of relation "sequence_test_table" does not exist
DROP TABLE sequence_test_table;
+-- sequence data types
+CREATE SEQUENCE sequence_test5 AS integer;
+CREATE SEQUENCE sequence_test6 AS smallint;
+CREATE SEQUENCE sequence_test7 AS bigint;
+CREATE SEQUENCE sequence_testx AS text;
+ERROR: sequence type must be smallint, integer, or bigint
+CREATE SEQUENCE sequence_testx AS nosuchtype;
+ERROR: type "nosuchtype" does not exist
+LINE 1: CREATE SEQUENCE sequence_testx AS nosuchtype;
+ ^
+ALTER SEQUENCE sequence_test5 AS smallint; -- fails
+ERROR: MAXVALUE (2147483647) is out of range for sequence data type smallint
+ALTER SEQUENCE sequence_test5 AS smallint NO MINVALUE NO MAXVALUE;
+CREATE SEQUENCE sequence_testx AS smallint MAXVALUE 100000;
+ERROR: MAXVALUE (100000) is out of range for sequence data type smallint
+CREATE SEQUENCE sequence_testx AS smallint MINVALUE -100000;
+ERROR: MINVALUE (-100000) is out of range for sequence data type smallint
---
--- test creation of SERIAL column
---
regression | public | sequence_test2 | bigint | 64 | 2 | 0 | 32 | 5 | 36 | 4 | YES
regression | public | sequence_test3 | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
regression | public | sequence_test4 | bigint | 64 | 2 | 0 | -1 | -9223372036854775808 | -1 | -1 | NO
- regression | public | serialtest1_f2_foo | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
- regression | public | serialtest2_f2_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
- regression | public | serialtest2_f3_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
- regression | public | serialtest2_f4_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
+ regression | public | sequence_test5 | smallint | 16 | 2 | 0 | 1 | 1 | 32767 | 1 | NO
+ regression | public | sequence_test6 | smallint | 16 | 2 | 0 | 1 | 1 | 32767 | 1 | NO
+ regression | public | sequence_test7 | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
+ regression | public | serialtest1_f2_foo | integer | 32 | 2 | 0 | 1 | 1 | 2147483647 | 1 | NO
+ regression | public | serialtest2_f2_seq | integer | 32 | 2 | 0 | 1 | 1 | 2147483647 | 1 | NO
+ regression | public | serialtest2_f3_seq | smallint | 16 | 2 | 0 | 1 | 1 | 32767 | 1 | NO
+ regression | public | serialtest2_f4_seq | smallint | 16 | 2 | 0 | 1 | 1 | 32767 | 1 | NO
regression | public | serialtest2_f5_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
regression | public | serialtest2_f6_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
-(9 rows)
+(12 rows)
SELECT schemaname, sequencename, start_value, min_value, max_value, increment_by, cycle, cache_size, last_value
FROM pg_sequences
public | sequence_test2 | 32 | 5 | 36 | 4 | t | 1 | 5
public | sequence_test3 | 1 | 1 | 9223372036854775807 | 1 | f | 1 |
public | sequence_test4 | -1 | -9223372036854775808 | -1 | -1 | f | 1 | -1
- public | serialtest1_f2_foo | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 3
- public | serialtest2_f2_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2
- public | serialtest2_f3_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2
- public | serialtest2_f4_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2
+ public | sequence_test5 | 1 | 1 | 32767 | 1 | f | 1 |
+ public | sequence_test6 | 1 | 1 | 32767 | 1 | f | 1 |
+ public | sequence_test7 | 1 | 1 | 9223372036854775807 | 1 | f | 1 |
+ public | serialtest1_f2_foo | 1 | 1 | 2147483647 | 1 | f | 1 | 3
+ public | serialtest2_f2_seq | 1 | 1 | 2147483647 | 1 | f | 1 | 2
+ public | serialtest2_f3_seq | 1 | 1 | 32767 | 1 | f | 1 | 2
+ public | serialtest2_f4_seq | 1 | 1 | 32767 | 1 | f | 1 | 2
public | serialtest2_f5_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2
public | serialtest2_f6_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2
-(9 rows)
+(12 rows)
SELECT * FROM pg_sequence_parameters('sequence_test4'::regclass);
- start_value | minimum_value | maximum_value | increment | cycle_option | cache_size
--------------+----------------------+---------------+-----------+--------------+------------
- -1 | -9223372036854775808 | -1 | -1 | f | 1
+ start_value | minimum_value | maximum_value | increment | cycle_option | cache_size | data_type
+-------------+----------------------+---------------+-----------+--------------+------------+-----------
+ -1 | -9223372036854775808 | -1 | -1 | f | 1 | 20
(1 row)
-- Test comments
CREATE SEQUENCE sequence_testx OWNED BY sequence_test_table.b; -- wrong column
DROP TABLE sequence_test_table;
+-- sequence data types
+CREATE SEQUENCE sequence_test5 AS integer;
+CREATE SEQUENCE sequence_test6 AS smallint;
+CREATE SEQUENCE sequence_test7 AS bigint;
+CREATE SEQUENCE sequence_testx AS text;
+CREATE SEQUENCE sequence_testx AS nosuchtype;
+
+ALTER SEQUENCE sequence_test5 AS smallint; -- fails
+ALTER SEQUENCE sequence_test5 AS smallint NO MINVALUE NO MAXVALUE;
+
+CREATE SEQUENCE sequence_testx AS smallint MAXVALUE 100000;
+CREATE SEQUENCE sequence_testx AS smallint MINVALUE -100000;
+
---
--- test creation of SERIAL column
---