forked from docs/doc-exports
Reviewed-by: Pruthi, Vineet <vineet.pruthi@t-systems.com> Co-authored-by: Lu, Huayi <luhuayi@huawei.com> Co-committed-by: Lu, Huayi <luhuayi@huawei.com>
388 lines
62 KiB
HTML
388 lines
62 KiB
HTML
<a name="EN-US_TOPIC_0000001188429088"></a><a name="EN-US_TOPIC_0000001188429088"></a>
|
|
|
|
<h1 class="topictitle1">CREATE TYPE</h1>
|
|
<div id="body1551942823551"><div class="section" id="EN-US_TOPIC_0000001188429088__sb16e3bf84c414769a0f46edc6f00fba5"><h4 class="sectiontitle">Function</h4><p id="EN-US_TOPIC_0000001188429088__p105231915193720"><strong id="EN-US_TOPIC_0000001188429088__b2716163912912">CREATE TYPE</strong> defines a new data type in the current database. The user who defines a new data type becomes its owner. Types are designed only for row-store tables.</p>
|
|
<p id="EN-US_TOPIC_0000001188429088__p20460781475">Four types of data can be created by using <strong id="EN-US_TOPIC_0000001188429088__b1325493893218">CREATE TYPE</strong>: composite data, base data, a shell data, and enumerated data.</p>
|
|
<ul id="EN-US_TOPIC_0000001188429088__ul1188784611381"><li id="EN-US_TOPIC_0000001188429088__li888784623814">Composite types<p id="EN-US_TOPIC_0000001188429088__p11237174918386"><a name="EN-US_TOPIC_0000001188429088__li888784623814"></a><a name="li888784623814"></a>A composite type is specified by a list of attribute names and data types. If the data type of an attribute is collatable, the attribute's collation rule can also be specified. A composite type is essentially the same as the row type of a table. However, using <strong id="EN-US_TOPIC_0000001188429088__b127848318218">CREATE TYPE</strong> avoids the need to create an actual table when only a type needs to be defined. In addition, a standalone composite type is useful, for example, as the parameter or return type of a function.</p>
|
|
<p id="EN-US_TOPIC_0000001188429088__p2186115112380">To create a composite type, you must have the <strong id="EN-US_TOPIC_0000001188429088__b168745912238">USAGE</strong> permission for all its attribute types.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li1888194610383">Base types<p id="EN-US_TOPIC_0000001188429088__p14784155253820"><a name="EN-US_TOPIC_0000001188429088__li1888194610383"></a><a name="li1888194610383"></a>You can customize a new base type (scalar type). Generally, functions required for base types must be coded in C or another low-level language.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li102851849135010">Shell types<p id="EN-US_TOPIC_0000001188429088__p3795195055018"><a name="EN-US_TOPIC_0000001188429088__li102851849135010"></a><a name="li102851849135010"></a>This parameter allows you to create a shell type, which is a type name that has no definition yet. You can use CREATE TYPE with only the type name to make a shell type. Shell types are needed as forward references when base types are created.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li11735434112116">Enumerated types<p id="EN-US_TOPIC_0000001188429088__p1616012407213"><a name="EN-US_TOPIC_0000001188429088__li11735434112116"></a><a name="li11735434112116"></a>An enumerated type is a list of enumerated values. Each value is a non-empty string with the maximum length of 64 bytes.</p>
|
|
</li></ul>
|
|
</div>
|
|
<div class="section" id="EN-US_TOPIC_0000001188429088__s435bd30349fe494396ab4c64e1f53667"><h4 class="sectiontitle">Precautions</h4><p id="EN-US_TOPIC_0000001188429088__a5aef5b3a030b423092ea315e70223935">If a schema name is given, the type will be created in the specified schema. Otherwise, it will be created in the current schema. The type name must be distinct from the name of any existing type or domain in the same schema. (Because tables have associated data types, the type name must also be distinct from the name of any existing table in the same schema.)</p>
|
|
</div>
|
|
<div class="section" id="EN-US_TOPIC_0000001188429088__s790ca3d258f44e9b9819ea435cd0741b"><h4 class="sectiontitle">Syntax</h4><div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188429088__sfec2a3142b66414ca49a8f48306ad9c1"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
|
|
<span class="normal"> 2</span>
|
|
<span class="normal"> 3</span>
|
|
<span class="normal"> 4</span>
|
|
<span class="normal"> 5</span>
|
|
<span class="normal"> 6</span>
|
|
<span class="normal"> 7</span>
|
|
<span class="normal"> 8</span>
|
|
<span class="normal"> 9</span>
|
|
<span class="normal">10</span>
|
|
<span class="normal">11</span>
|
|
<span class="normal">12</span>
|
|
<span class="normal">13</span>
|
|
<span class="normal">14</span>
|
|
<span class="normal">15</span>
|
|
<span class="normal">16</span>
|
|
<span class="normal">17</span>
|
|
<span class="normal">18</span>
|
|
<span class="normal">19</span>
|
|
<span class="normal">20</span>
|
|
<span class="normal">21</span>
|
|
<span class="normal">22</span>
|
|
<span class="normal">23</span>
|
|
<span class="normal">24</span>
|
|
<span class="normal">25</span>
|
|
<span class="normal">26</span>
|
|
<span class="normal">27</span>
|
|
<span class="normal">28</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TYPE</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="k">AS</span>
|
|
<span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="n">attribute_name</span><span class="w"> </span><span class="n">data_type</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="k">COLLATE</span><span class="w"> </span><span class="k">collation</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">[,</span><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">)</span>
|
|
|
|
<span class="k">CREATE</span><span class="w"> </span><span class="k">TYPE</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="p">(</span>
|
|
<span class="w"> </span><span class="k">INPUT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">input_function</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="k">OUTPUT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">output_function</span>
|
|
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">RECEIVE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">receive_function</span><span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">SEND</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">send_function</span><span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">TYPMOD_IN</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">type_modifier_input_function</span><span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">TYPMOD_OUT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">type_modifier_output_function</span><span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="k">ANALYZE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">analyze_function</span><span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">INTERNALLENGTH</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="err">{</span><span class="w"> </span><span class="n">internallength</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">VARIABLE</span><span class="w"> </span><span class="err">}</span><span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">PASSEDBYVALUE</span><span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">ALIGNMENT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">alignment</span><span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="k">STORAGE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">storage</span><span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="k">LIKE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">like_type</span><span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">CATEGORY</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">category</span><span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">PREFERRED</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">preferred</span><span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">default</span><span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">ELEMENT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element</span><span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="k">DELIMITER</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">delimiter</span><span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">COLLATABLE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">collatable</span><span class="w"> </span><span class="p">]</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="k">CREATE</span><span class="w"> </span><span class="k">TYPE</span><span class="w"> </span><span class="n">name</span>
|
|
|
|
<span class="k">CREATE</span><span class="w"> </span><span class="k">TYPE</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">ENUM</span>
|
|
<span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="s1">'label'</span><span class="w"> </span><span class="p">[,</span><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">)</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="section" id="EN-US_TOPIC_0000001188429088__s6868bec7da064a909ce22191f0768244"><h4 class="sectiontitle">Parameter Description</h4><p id="EN-US_TOPIC_0000001188429088__p1288711452219">Composite types</p>
|
|
<ul id="EN-US_TOPIC_0000001188429088__ue26183ecff0645ac8644f93ceee36097"><li id="EN-US_TOPIC_0000001188429088__l77288a7aa397435c93c55f8691710264"><strong id="EN-US_TOPIC_0000001188429088__b17763241835">name</strong><p id="EN-US_TOPIC_0000001188429088__p58691113033">Specifies the name of the type to be created. It can be schema-qualified.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li532312221530"><strong id="EN-US_TOPIC_0000001188429088__b01531135332">attribute_name</strong><p id="EN-US_TOPIC_0000001188429088__p1632454313311">Specifies the name of an attribute (column) for the composite type.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li145416571739"><strong id="EN-US_TOPIC_0000001188429088__b14719394411">data_type</strong><p id="EN-US_TOPIC_0000001188429088__p1380516192049">Specifies the name of an existing data type to become a column of the composite type.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li145255413433"><strong id="EN-US_TOPIC_0000001188429088__b2080919231372">collation</strong><p id="EN-US_TOPIC_0000001188429088__p974312694317">Specifies the name of an existing collation rule to be associated with a column of the composite type.</p>
|
|
</li></ul>
|
|
<p id="EN-US_TOPIC_0000001188429088__p5448152814318">Base types</p>
|
|
<p id="EN-US_TOPIC_0000001188429088__p158694247352">When creating a base type, you can place parameters in any order. The <strong id="EN-US_TOPIC_0000001188429088__b6808123553810">input_function</strong> and <strong id="EN-US_TOPIC_0000001188429088__b1055343843812">output_function</strong> parameters are mandatory, and other parameters are optional.</p>
|
|
<ul id="EN-US_TOPIC_0000001188429088__ul6555182814431"><li id="EN-US_TOPIC_0000001188429088__li1555628184310"><strong id="EN-US_TOPIC_0000001188429088__b0555228174315">input_function</strong><p id="EN-US_TOPIC_0000001188429088__p105551828184318">Specifies the name of a function that converts data from the external text format of a type to its internal format.</p>
|
|
<p id="EN-US_TOPIC_0000001188429088__p1284141513124">An input function can be declared as taking one parameter of the cstring type or taking three parameters of the cstring, oid, and integer types.</p>
|
|
<ul id="EN-US_TOPIC_0000001188429088__ul173814513135"><li id="EN-US_TOPIC_0000001188429088__li79811348151317">The cstring-type parameter is the input text as a C string.</li><li id="EN-US_TOPIC_0000001188429088__li5981154820134">The oid-type parameter is the OID of the type (except for array types, where the parameter is the element type OID of an array type).</li><li id="EN-US_TOPIC_0000001188429088__li2098264815133">The integer-type parameter is typmod of the destination column, if known (<strong id="EN-US_TOPIC_0000001188429088__b1197720774813">-1</strong> will be passed if not known).</li></ul>
|
|
<p id="EN-US_TOPIC_0000001188429088__p2027685514154">An input function must return a value of the data type itself. Generally, an input function must be declared as <strong id="EN-US_TOPIC_0000001188429088__b897464195114">STRICT</strong>. If it is not, it will be called with a <strong id="EN-US_TOPIC_0000001188429088__b1275556185215">NULL</strong> parameter coming first when the system reads a <strong id="EN-US_TOPIC_0000001188429088__b112191819175213">NULL</strong> input value. In this case, the function must still return <strong id="EN-US_TOPIC_0000001188429088__b13519203914533">NULL</strong> unless an error raises. (This mechanism is designed for supporting domain input functions, which may need to reject <strong id="EN-US_TOPIC_0000001188429088__b8906132765520">NULL</strong> input values.)</p>
|
|
<div class="note" id="EN-US_TOPIC_0000001188429088__note863756205811"><img src="public_sys-resources/note_3.0-en-us.png"><span class="notetitle"> </span><div class="notebody"><p id="EN-US_TOPIC_0000001188429088__p5609344183916">Input and output functions can be declared to have the results or parameters of a new type because they have to be created before the new type is created. The new type should first be defined as a shell type, which is a placeholder type that has no attributes except a name and an owner. This can be done by delivering the <strong id="EN-US_TOPIC_0000001188429088__b187243391708">CREATE TYPE</strong> <em id="EN-US_TOPIC_0000001188429088__i1278219411601">name</em> statement, with no additional parameters. Then, the C I/O functions can be defined as referencing the shell type. Finally, <strong id="EN-US_TOPIC_0000001188429088__b155011114526">CREATE TYPE</strong> with a full definition replaces the shell type with a complete, valid type definition. After that, the new type can be used normally.</p>
|
|
</div></div>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li3538141144415"><strong id="EN-US_TOPIC_0000001188429088__b655532804318">output_function</strong><p id="EN-US_TOPIC_0000001188429088__p13555202844317">Specifies the name of a function that converts data from the internal format of a type to its external text format.</p>
|
|
<p id="EN-US_TOPIC_0000001188429088__p17250445149">An output function must be declared as taking one parameter of a new data type. It must return data of the cstring type. Output functions are not invoked for <strong id="EN-US_TOPIC_0000001188429088__b12723625173">NULL</strong> values.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li872416516445"><strong id="EN-US_TOPIC_0000001188429088__b0555162812433">receive_function</strong><p id="EN-US_TOPIC_0000001188429088__p75551028174311">(Optional) Specifies the name of a function that converts data from the external binary format of a type to its internal format.</p>
|
|
<p id="EN-US_TOPIC_0000001188429088__p327121082316">If this function is not used, the type cannot participate in binary input. It costs lower to convert the binary format to the internal format, more portable. (For example, the standard integer data types use the network byte order as an external binary representation, whereas the internal representation is in the machine's native byte order.) This function should perform adequate checks to ensure a valid value.</p>
|
|
<p id="EN-US_TOPIC_0000001188429088__p84285256293">Also, this function can be declared as taking one parameter of the internal type or taking three parameters of the internal, oid, and integer types.</p>
|
|
<ul id="EN-US_TOPIC_0000001188429088__ul107511335336"><li id="EN-US_TOPIC_0000001188429088__li9204655133219">The internal-type parameter is a pointer to a StringInfo buffer holding received byte strings.</li><li id="EN-US_TOPIC_0000001188429088__li0205195593213">The oid- and integer-type parameters are the same as those of the text input function.</li></ul>
|
|
<p id="EN-US_TOPIC_0000001188429088__p20710584339">A receive function must return a value of the data type itself. Generally, a receive function must be declared as <strong id="EN-US_TOPIC_0000001188429088__b19104153181915">STRICT</strong>. If it is not, it will be called with a <strong id="EN-US_TOPIC_0000001188429088__b469550182013">NULL</strong> parameter coming first when the system reads a <strong id="EN-US_TOPIC_0000001188429088__b1469617042016">NULL</strong> input value. In this case, the function must still return <strong id="EN-US_TOPIC_0000001188429088__b811916173204">NULL</strong> unless an error raises. (This mechanism is designed for supporting domain receive functions, which may need to reject <strong id="EN-US_TOPIC_0000001188429088__b14121131772019">NULL</strong> input values.)</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li1092248114418"><strong id="EN-US_TOPIC_0000001188429088__b125555286437">send_function</strong><p id="EN-US_TOPIC_0000001188429088__p3555728204316">(Optional) Specifies the name of a function that converts data from the internal format of a type to its external binary format.</p>
|
|
<p id="EN-US_TOPIC_0000001188429088__p177614289579">If this function is not used, the type cannot participate in binary output. A send function must be declared as taking one parameter of a new data type. It must return data of the bytea type. Send functions are not invoked for <strong id="EN-US_TOPIC_0000001188429088__b1091714239353">NULL</strong> values.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li2197812134414"><strong id="EN-US_TOPIC_0000001188429088__b19555132814438">type_modifier_input_function</strong><p id="EN-US_TOPIC_0000001188429088__p4555172844312">(Optional) Specifies the name of a function that converts an array of modifiers for a type to its internal format.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li195831166444"><strong id="EN-US_TOPIC_0000001188429088__b855542819436">type_modifier_output_function</strong><p id="EN-US_TOPIC_0000001188429088__p1755532812438">(Optional) Specifies the name of a function that converts the internal format of modifiers for a type to its external text format.</p>
|
|
<div class="note" id="EN-US_TOPIC_0000001188429088__note41036467581"><img src="public_sys-resources/note_3.0-en-us.png"><span class="notetitle"> </span><div class="notebody"><p id="EN-US_TOPIC_0000001188429088__p3573104735813"><strong id="EN-US_TOPIC_0000001188429088__b76061250871">type_modifier_input_function</strong> and <strong id="EN-US_TOPIC_0000001188429088__b1360715501175">type_modifier_output_function</strong> are needed if a type supports modifiers, that is, optional constraints attached to a type declaration, such as char(5) or numeric(30,2). <span id="EN-US_TOPIC_0000001188429088__text308000707">GaussDB(DWS)</span> allows user-defined types to take one or more simple constants or identifiers as modifiers. However, this information must be capable of being packed into a single non-negative integer value for storage in system catalogs. Declared modifiers are passed to <strong id="EN-US_TOPIC_0000001188429088__b1445819567509">type_modifier_input_function</strong> in the cstring array format. The parameter must check values for validity, throwing an error if they are wrong. If they are correct, the parameter will return a single non-negative integer value, which will be stored as typmod in a column. If the type does not have <strong id="EN-US_TOPIC_0000001188429088__b19784957745">type_modifier_input_function</strong>, type modifiers will be rejected. <strong id="EN-US_TOPIC_0000001188429088__b1558102719517">type_modifier_output_function</strong> converts the internal integer typmod value back to a correct format for user display. It must return a cstring value, which is the exact string appending to the type name. For example, a numeric function may return (30,2). If the default display format is enclosing a stored typmod integer value in parentheses, you can omit <strong id="EN-US_TOPIC_0000001188429088__b05863371011">type_modifier_output_function</strong>.</p>
|
|
</div></div>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li1172202014414"><strong id="EN-US_TOPIC_0000001188429088__b555514284436">analyze_function</strong><p id="EN-US_TOPIC_0000001188429088__p755532811431">(Optional) Specifies the name of a function that performs statistical analysis for a data type.</p>
|
|
<p id="EN-US_TOPIC_0000001188429088__p39988717594">By default, if there is a default B-tree operator class for a type, <strong id="EN-US_TOPIC_0000001188429088__b119917641410">ANALYZE</strong> will attempt to gather statistics by using the "equals" and "less-than" operators of the type. This behavior is inappropriate for non-scalar types, and can be overridden by specifying a custom analysis function. The analysis function must be declared to take one parameter of the internal type and return a boolean result.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li6260152311440"><strong id="EN-US_TOPIC_0000001188429088__b5555142894311">internallength</strong><p id="EN-US_TOPIC_0000001188429088__p18555428144320">(Optional) Specifies a numeric constant for specifying the length in bytes of the internal representation of a new type. By default, it is variable-length.</p>
|
|
<p id="EN-US_TOPIC_0000001188429088__p135122985915">Although the details of the new type's internal representation are only known to I/O functions and other functions that you create to work with the type, there are still some attributes of the internal representation that must be declared to <span id="EN-US_TOPIC_0000001188429088__text66435536">GaussDB(DWS)</span>. The most important one is <strong id="EN-US_TOPIC_0000001188429088__b8501724172410">internallength</strong>. Base data types can be fixed-length (when <strong id="EN-US_TOPIC_0000001188429088__b14604183812619">internallength</strong> is a positive integer) or variable-length (when <strong id="EN-US_TOPIC_0000001188429088__b184427142716">internallength</strong> is set to <strong id="EN-US_TOPIC_0000001188429088__b1739579132710">VARIABLE</strong>; internally, this is represented by setting <strong id="EN-US_TOPIC_0000001188429088__b15415184520276">typlen</strong> to <strong id="EN-US_TOPIC_0000001188429088__b1441444842710">-1</strong>). The internal representation of all variable-length types must start with a 4-byte integer. <strong id="EN-US_TOPIC_0000001188429088__b18871129102914">internallength</strong> defines the total length.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li12805161011187"><strong id="EN-US_TOPIC_0000001188429088__b7535175914212">PASSEDBYVALUE</strong><p id="EN-US_TOPIC_0000001188429088__p20826121015189">(Optional) Specifies that values of a data type are passed by value, rather than by reference. Types passed by value must be fixed-length, and their internal representation cannot be larger than the size of the Datum type (4 bytes on some machines, and 8 bytes on others).</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li1469432734418"><strong id="EN-US_TOPIC_0000001188429088__b1355572811439">alignment</strong><p id="EN-US_TOPIC_0000001188429088__p955552834315">(Optional) Specifies the storage alignment required for a data type. It supports values <strong id="EN-US_TOPIC_0000001188429088__b24487205346">char</strong>, <strong id="EN-US_TOPIC_0000001188429088__b20941152115342">int2</strong>, <strong id="EN-US_TOPIC_0000001188429088__b823117237347">int4</strong>, and <strong id="EN-US_TOPIC_0000001188429088__b59311624173419">double</strong>. The default value is <strong id="EN-US_TOPIC_0000001188429088__b16169152763413">int4</strong>.</p>
|
|
<p id="EN-US_TOPIC_0000001188429088__p1935919221303">The allowed values equate to alignment on 1-, 2-, 4-, or 8-byte boundaries. Note that variable-length types must have an alignment of at least 4 since they must contain an int4 value as their first component.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li1888953034416"><strong id="EN-US_TOPIC_0000001188429088__b1055519284436">storage</strong><p id="EN-US_TOPIC_0000001188429088__p2555228194317">(Optional) Specifies the storage strategy for a data type.</p>
|
|
<p id="EN-US_TOPIC_0000001188429088__p1716611397427">It supports values <strong id="EN-US_TOPIC_0000001188429088__b723294711361">plain</strong>, <strong id="EN-US_TOPIC_0000001188429088__b97861481360">external</strong>, <strong id="EN-US_TOPIC_0000001188429088__b09591349133619">extended</strong>, and <strong id="EN-US_TOPIC_0000001188429088__b108971652103612">main</strong>. The default value is <strong id="EN-US_TOPIC_0000001188429088__b168716562368">plain</strong>.</p>
|
|
<ul id="EN-US_TOPIC_0000001188429088__ul534162219433"><li id="EN-US_TOPIC_0000001188429088__li739732014436"><strong id="EN-US_TOPIC_0000001188429088__b65701143133719">plain</strong> specifies that data of a type will always be stored in-line and not compressed. (Only <strong id="EN-US_TOPIC_0000001188429088__b748015379376">plain</strong> is allowed for fixed-length types.)</li><li id="EN-US_TOPIC_0000001188429088__li15399172014432"><strong id="EN-US_TOPIC_0000001188429088__b3309148104714">extended</strong> specifies that the system will first try to compress a long data value and will then move the value out of the main table row if it is still too long.</li><li id="EN-US_TOPIC_0000001188429088__li20401420184312"><strong id="EN-US_TOPIC_0000001188429088__b748517693915">external</strong> allows a value to be moved out of the main table, but the system will not try to compress it.</li><li id="EN-US_TOPIC_0000001188429088__li20402192074313"><strong id="EN-US_TOPIC_0000001188429088__b4686114413398">main</strong> allows for compression, but discourages moving a value out of the main table. (Data items with this storage strategy might still be moved out of the main table if there is no other way to make a row fit. However, they will be kept in the main table preferentially over <strong id="EN-US_TOPIC_0000001188429088__b4602111934011">extended</strong> and <strong id="EN-US_TOPIC_0000001188429088__b16521132304013">external</strong> items.)<p id="EN-US_TOPIC_0000001188429088__p2747103415014">All <strong id="EN-US_TOPIC_0000001188429088__b1941218818438">storage</strong> values except <strong id="EN-US_TOPIC_0000001188429088__b162701416164314">plain</strong> imply that the functions of the data type can handle values that have been toasted. A given value merely determines the default <strong id="EN-US_TOPIC_0000001188429088__b12954132174511">TOAST</strong> storage strategy for columns of a toastable data type. Users can choose other strategies for individual columns by using <strong id="EN-US_TOPIC_0000001188429088__b555614694520">ALTER TABLE SET STORAGE</strong>.</p>
|
|
</li></ul>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li393411339441"><strong id="EN-US_TOPIC_0000001188429088__b85556285435">like_type</strong><p id="EN-US_TOPIC_0000001188429088__p7555028144317">(Optional) Specifies the name of an existing data type that has the same representation as a new type. The values of <strong id="EN-US_TOPIC_0000001188429088__b154899427494">internallength</strong>, <strong id="EN-US_TOPIC_0000001188429088__b32721644174918">passedbyvalue</strong>, <strong id="EN-US_TOPIC_0000001188429088__b1564474554918">alignment</strong>, and <strong id="EN-US_TOPIC_0000001188429088__b203964487493">storage</strong> are copied from this type, unless they are overridden by explicit specifications elsewhere in the <strong id="EN-US_TOPIC_0000001188429088__b1273311185010">CREATE TYPE</strong> command.</p>
|
|
<p id="EN-US_TOPIC_0000001188429088__p5363144813018">Specifying representation in this way is especially useful when the low-level implementation of a new type references an existing type.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li8891338134413"><strong id="EN-US_TOPIC_0000001188429088__b85557286436">category</strong><p id="EN-US_TOPIC_0000001188429088__p135557284439">(Optional) Specifies the category code (a single ASCII character) for a type. The default value is <strong id="EN-US_TOPIC_0000001188429088__b105152024145417">U</strong> for a user-defined type. You can also choose other ASCII characters to create custom categories.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li52492411447"><strong id="EN-US_TOPIC_0000001188429088__b55556282430">preferred</strong><p id="EN-US_TOPIC_0000001188429088__p1755592811431">(Optional) Specifies whether a type is preferred within its type category. If it is, the value will be <strong id="EN-US_TOPIC_0000001188429088__b1367615121616">TRUE</strong>, else <strong id="EN-US_TOPIC_0000001188429088__b6471914964">FALSE</strong>. The default value is <strong id="EN-US_TOPIC_0000001188429088__b57977422064">FALSE</strong>. Be cautious when creating a new preferred type within an existing type category because this could cause great changes in behavior.</p>
|
|
<div class="note" id="EN-US_TOPIC_0000001188429088__note1228123415312"><img src="public_sys-resources/note_3.0-en-us.png"><span class="notetitle"> </span><div class="notebody"><p id="EN-US_TOPIC_0000001188429088__p52811434175310">The <strong id="EN-US_TOPIC_0000001188429088__b696841110819">category</strong> and <strong id="EN-US_TOPIC_0000001188429088__b6429714587">preferred</strong> parameters can be used to help determine which implicit cast excels in ambiguous situations. Each data type belongs to a category named by a single ASCII character, and each type is either preferred or not within its category. If this rule is helpful in resolving overloaded functions or operators, the parser will prefer casting to preferred types (but only from other types within the same category). For types that have no implicit casts to or from any other types, it is sufficient to leave these parameters at their default values. However, for a group of types that have implicit casts, mark them all as belonging to a category and select one or two of the most general types as being preferred within the category. The <strong id="EN-US_TOPIC_0000001188429088__b1342894410163">category</strong> parameter is helpful in adding a user-defined type to an existing built-in category, such as the numeric or string type. However, you can also create new entirely-user-defined type categories. Select any ASCII character other than an uppercase letter to name such a category.</p>
|
|
</div></div>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li1639264514413"><strong id="EN-US_TOPIC_0000001188429088__b1955522864312">default</strong><p id="EN-US_TOPIC_0000001188429088__p85551428194318">(Optional) Specifies the default value for a data type. If this parameter is omitted, the default value will be <strong id="EN-US_TOPIC_0000001188429088__b9341846102016">NULL</strong>.</p>
|
|
<p id="EN-US_TOPIC_0000001188429088__p655515282438">A default value can be specified if you expect the columns of a data type to default to something other than the <strong id="EN-US_TOPIC_0000001188429088__b11725122162312">NULL</strong> value. You can also specify a default value using the <strong id="EN-US_TOPIC_0000001188429088__b5633133412234">DEFAULT</strong> keyword. (Such a default value can be overridden by an explicit <strong id="EN-US_TOPIC_0000001188429088__b43389579234">DEFAULT</strong> clause attached to a particular column.)</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li61811248194416"><strong id="EN-US_TOPIC_0000001188429088__b2555142812433">element</strong><p id="EN-US_TOPIC_0000001188429088__p1755532817432">(Optional) Specifies the type of an array element when an array type is created. For example, to define an array of 4-byte integers (int4), set <strong id="EN-US_TOPIC_0000001188429088__b11482183922613">ELEMENT</strong> to <strong id="EN-US_TOPIC_0000001188429088__b8910343122616">int4</strong>.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li1594575024415"><strong id="EN-US_TOPIC_0000001188429088__b25556285433">delimiter</strong><p id="EN-US_TOPIC_0000001188429088__p195551728104310">(Optional) Specifies the delimiter character to be used between values in arrays made of a type.</p>
|
|
<p id="EN-US_TOPIC_0000001188429088__p12691551521"><strong id="EN-US_TOPIC_0000001188429088__b1274592622917">delimiter</strong> can be set to a specific character. The default delimiter is a comma (,). Note that a delimiter is associated with the array element type, instead of the array type itself.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li359415315441"><strong id="EN-US_TOPIC_0000001188429088__b655514284439">collatable</strong><p id="EN-US_TOPIC_0000001188429088__p1255592814432">(Optional) Specifies whether a type's operations can use collation information. If they can, the value will be <strong id="EN-US_TOPIC_0000001188429088__b13760181113212">TRUE</strong>, else <strong id="EN-US_TOPIC_0000001188429088__b9263131314324">FALSE</strong> (default).</p>
|
|
<p id="EN-US_TOPIC_0000001188429088__p35553284432">If <strong id="EN-US_TOPIC_0000001188429088__b158511843153219">collatable</strong> is <strong id="EN-US_TOPIC_0000001188429088__b6808154633212">TRUE</strong>, column definitions and expressions of a type may carry collation information by using the <strong id="EN-US_TOPIC_0000001188429088__b133761873320">COLLATE</strong> clause. It is the implementations of functions operating on the type that actually use the collation information. This use cannot be achieved merely by marking the type collatable.</p>
|
|
</li><li id="EN-US_TOPIC_0000001188429088__li4750165872719"><strong id="EN-US_TOPIC_0000001188429088__b12181720142818">lable</strong><p id="EN-US_TOPIC_0000001188429088__p65721214102813">(Optional) Specifies a text label associated with an enumerated value. It is a non-empty string of up to 64 characters.</p>
|
|
</li></ul>
|
|
<div class="note" id="EN-US_TOPIC_0000001188429088__note4555228184315"><img src="public_sys-resources/note_3.0-en-us.png"><span class="notetitle"> </span><div class="notebody"><p id="EN-US_TOPIC_0000001188429088__p16604183418102">Whenever a user-defined type is created, <span id="EN-US_TOPIC_0000001188429088__text671270565">GaussDB(DWS)</span> automatically creates an associated array type whose name consists of the element type name prepended with an underscore (_).</p>
|
|
</div></div>
|
|
</div>
|
|
<div class="section" id="EN-US_TOPIC_0000001188429088__se738100ee09a4a1a87ac9d49fc7ab71c"><h4 class="sectiontitle">Example</h4><p id="EN-US_TOPIC_0000001188429088__p190468266">Example 1: Create a composite type, create a table, insert data, and make a query.</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188429088__screen126051528113917"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span>
|
|
<span class="normal">4</span>
|
|
<span class="normal">5</span>
|
|
<span class="normal">6</span>
|
|
<span class="normal">7</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TYPE</span><span class="w"> </span><span class="n">compfoo</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="p">(</span><span class="n">f1</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="w"> </span><span class="n">f2</span><span class="w"> </span><span class="nb">text</span><span class="p">);</span>
|
|
<span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">t1_compfoo</span><span class="p">(</span><span class="n">a</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">compfoo</span><span class="p">);</span>
|
|
<span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">t2_compfoo</span><span class="p">(</span><span class="n">a</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">compfoo</span><span class="p">);</span>
|
|
<span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="n">t1_compfoo</span><span class="w"> </span><span class="k">values</span><span class="p">(</span><span class="mi">1</span><span class="p">,(</span><span class="mi">1</span><span class="p">,</span><span class="s1">'demo'</span><span class="p">));</span>
|
|
<span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="n">t2_compfoo</span><span class="w"> </span><span class="k">select</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">t1_compfoo</span><span class="p">;</span>
|
|
<span class="k">SELECT</span><span class="w"> </span><span class="p">(</span><span class="n">b</span><span class="p">).</span><span class="n">f1</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">t1_compfoo</span><span class="p">;</span>
|
|
<span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">t1_compfoo</span><span class="w"> </span><span class="n">t1</span><span class="w"> </span><span class="k">join</span><span class="w"> </span><span class="n">t2_compfoo</span><span class="w"> </span><span class="n">t2</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="p">(</span><span class="n">t1</span><span class="p">.</span><span class="n">b</span><span class="p">).</span><span class="n">f1</span><span class="o">=</span><span class="p">(</span><span class="n">t1</span><span class="p">.</span><span class="n">b</span><span class="p">).</span><span class="n">f1</span><span class="p">;</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001188429088__p107246102613">Example 2: Create an enumeration type and use it in the table definition.</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188429088__screen1613474873120"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span>
|
|
<span class="normal">4</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TYPE</span><span class="w"> </span><span class="n">bugstatus</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">ENUM</span><span class="w"> </span><span class="p">(</span><span class="s1">'create'</span><span class="p">,</span><span class="w"> </span><span class="s1">'modify'</span><span class="p">,</span><span class="w"> </span><span class="s1">'closed'</span><span class="p">);</span>
|
|
<span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">customer</span><span class="w"> </span><span class="p">(</span><span class="n">name</span><span class="w"> </span><span class="nb">text</span><span class="p">,</span><span class="n">current_bugstatus</span><span class="w"> </span><span class="n">bugstatus</span><span class="p">);</span>
|
|
<span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="n">customer</span><span class="w"> </span><span class="k">VALUES</span><span class="w"> </span><span class="p">(</span><span class="s1">'type'</span><span class="p">,</span><span class="s1">'create'</span><span class="p">);</span>
|
|
<span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">customer</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="n">current_bugstatus</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'create'</span><span class="p">;</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001188429088__p136184612263">Example 3: Compile a .so file and create the shell type.</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188429088__screen169841263590"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TYPE</span><span class="w"> </span><span class="n">complex</span><span class="p">;</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001188429088__p26446182612">This statement creates a placeholder for the type to be created, which can then be referenced when defining its I/O functions. Now you can define an I/O function. Note that the function must be declared in NOT FENCED mode when it is created.</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188429088__screen16661830900"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
|
|
<span class="normal"> 2</span>
|
|
<span class="normal"> 3</span>
|
|
<span class="normal"> 4</span>
|
|
<span class="normal"> 5</span>
|
|
<span class="normal"> 6</span>
|
|
<span class="normal"> 7</span>
|
|
<span class="normal"> 8</span>
|
|
<span class="normal"> 9</span>
|
|
<span class="normal">10</span>
|
|
<span class="normal">11</span>
|
|
<span class="normal">12</span>
|
|
<span class="normal">13</span>
|
|
<span class="normal">14</span>
|
|
<span class="normal">15</span>
|
|
<span class="normal">16</span>
|
|
<span class="normal">17</span>
|
|
<span class="normal">18</span>
|
|
<span class="normal">19</span>
|
|
<span class="normal">20</span>
|
|
<span class="normal">21</span>
|
|
<span class="normal">22</span>
|
|
<span class="normal">23</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">CREATE</span><span class="w"> </span><span class="k">FUNCTION</span>
|
|
<span class="n">complex_in</span><span class="p">(</span><span class="n">cstring</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="k">RETURNS</span><span class="w"> </span><span class="n">complex</span>
|
|
<span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="s1">'filename'</span>
|
|
<span class="w"> </span><span class="k">LANGUAGE</span><span class="w"> </span><span class="k">C</span><span class="w"> </span><span class="k">IMMUTABLE</span><span class="w"> </span><span class="k">STRICT</span><span class="w"> </span><span class="k">not</span><span class="w"> </span><span class="n">fenced</span><span class="p">;</span>
|
|
|
|
<span class="k">CREATE</span><span class="w"> </span><span class="k">FUNCTION</span>
|
|
<span class="n">complex_out</span><span class="p">(</span><span class="n">complex</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="k">RETURNS</span><span class="w"> </span><span class="n">cstring</span>
|
|
<span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="s1">'filename'</span>
|
|
<span class="w"> </span><span class="k">LANGUAGE</span><span class="w"> </span><span class="k">C</span><span class="w"> </span><span class="k">IMMUTABLE</span><span class="w"> </span><span class="k">STRICT</span><span class="w"> </span><span class="k">not</span><span class="w"> </span><span class="n">fenced</span><span class="p">;</span>
|
|
|
|
<span class="k">CREATE</span><span class="w"> </span><span class="k">FUNCTION</span>
|
|
<span class="n">complex_recv</span><span class="p">(</span><span class="n">internal</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="k">RETURNS</span><span class="w"> </span><span class="n">complex</span>
|
|
<span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="s1">'filename'</span>
|
|
<span class="w"> </span><span class="k">LANGUAGE</span><span class="w"> </span><span class="k">C</span><span class="w"> </span><span class="k">IMMUTABLE</span><span class="w"> </span><span class="k">STRICT</span><span class="w"> </span><span class="k">not</span><span class="w"> </span><span class="n">fenced</span><span class="p">;</span>
|
|
|
|
<span class="k">CREATE</span><span class="w"> </span><span class="k">FUNCTION</span>
|
|
<span class="n">complex_send</span><span class="p">(</span><span class="n">complex</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="k">RETURNS</span><span class="w"> </span><span class="n">bytea</span>
|
|
<span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="s1">'filename'</span>
|
|
<span class="w"> </span><span class="k">LANGUAGE</span><span class="w"> </span><span class="k">C</span><span class="w"> </span><span class="k">IMMUTABLE</span><span class="w"> </span><span class="k">STRICT</span><span class="w"> </span><span class="k">not</span><span class="w"> </span><span class="n">fenced</span><span class="p">;</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001188429088__p64046192619">-- Finally, provide a complete definition of the data type:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188429088__screen1912383612339"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span>
|
|
<span class="normal">4</span>
|
|
<span class="normal">5</span>
|
|
<span class="normal">6</span>
|
|
<span class="normal">7</span>
|
|
<span class="normal">8</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TYPE</span><span class="w"> </span><span class="n">complex</span><span class="w"> </span><span class="p">(</span>
|
|
<span class="n">internallength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">16</span><span class="p">,</span>
|
|
<span class="k">input</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">complex_in</span><span class="p">,</span>
|
|
<span class="k">output</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">complex_out</span><span class="p">,</span>
|
|
<span class="n">receive</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">complex_recv</span><span class="p">,</span>
|
|
<span class="n">send</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">complex_send</span><span class="p">,</span>
|
|
<span class="n">alignment</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">double</span>
|
|
<span class="p">);</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001188429088__p118513821410">The C functions corresponding to the input, output, receive, and send functions are defined as follows:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188429088__screen164503353149"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
|
|
<span class="normal"> 2</span>
|
|
<span class="normal"> 3</span>
|
|
<span class="normal"> 4</span>
|
|
<span class="normal"> 5</span>
|
|
<span class="normal"> 6</span>
|
|
<span class="normal"> 7</span>
|
|
<span class="normal"> 8</span>
|
|
<span class="normal"> 9</span>
|
|
<span class="normal">10</span>
|
|
<span class="normal">11</span>
|
|
<span class="normal">12</span>
|
|
<span class="normal">13</span>
|
|
<span class="normal">14</span>
|
|
<span class="normal">15</span>
|
|
<span class="normal">16</span>
|
|
<span class="normal">17</span>
|
|
<span class="normal">18</span>
|
|
<span class="normal">19</span>
|
|
<span class="normal">20</span>
|
|
<span class="normal">21</span>
|
|
<span class="normal">22</span>
|
|
<span class="normal">23</span>
|
|
<span class="normal">24</span>
|
|
<span class="normal">25</span>
|
|
<span class="normal">26</span>
|
|
<span class="normal">27</span>
|
|
<span class="normal">28</span>
|
|
<span class="normal">29</span>
|
|
<span class="normal">30</span>
|
|
<span class="normal">31</span>
|
|
<span class="normal">32</span>
|
|
<span class="normal">33</span>
|
|
<span class="normal">34</span>
|
|
<span class="normal">35</span>
|
|
<span class="normal">36</span>
|
|
<span class="normal">37</span>
|
|
<span class="normal">38</span>
|
|
<span class="normal">39</span>
|
|
<span class="normal">40</span>
|
|
<span class="normal">41</span>
|
|
<span class="normal">42</span>
|
|
<span class="normal">43</span>
|
|
<span class="normal">44</span>
|
|
<span class="normal">45</span>
|
|
<span class="normal">46</span>
|
|
<span class="normal">47</span>
|
|
<span class="normal">48</span>
|
|
<span class="normal">49</span>
|
|
<span class="normal">50</span>
|
|
<span class="normal">51</span>
|
|
<span class="normal">52</span>
|
|
<span class="normal">53</span>
|
|
<span class="normal">54</span>
|
|
<span class="normal">55</span>
|
|
<span class="normal">56</span>
|
|
<span class="normal">57</span>
|
|
<span class="normal">58</span>
|
|
<span class="normal">59</span>
|
|
<span class="normal">60</span>
|
|
<span class="normal">61</span>
|
|
<span class="normal">62</span>
|
|
<span class="normal">63</span>
|
|
<span class="normal">64</span>
|
|
<span class="normal">65</span>
|
|
<span class="normal">66</span>
|
|
<span class="normal">67</span>
|
|
<span class="normal">68</span>
|
|
<span class="normal">69</span>
|
|
<span class="normal">70</span>
|
|
<span class="normal">71</span>
|
|
<span class="normal">72</span></pre></div></td><td class="code"><div><pre><span></span><span class="c1">-- Define a structure body Complex:</span>
|
|
<span class="n">typedef</span><span class="w"> </span><span class="n">struct</span><span class="w"> </span><span class="n">Complex</span><span class="w"> </span><span class="err">{</span>
|
|
<span class="w"> </span><span class="n">double</span><span class="w"> </span><span class="n">x</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">double</span><span class="w"> </span><span class="n">y</span><span class="p">;</span>
|
|
<span class="err">}</span><span class="w"> </span><span class="n">Complex</span><span class="p">;</span>
|
|
|
|
<span class="c1">-- Define an input function:</span>
|
|
<span class="n">PG_FUNCTION_INFO_V1</span><span class="p">(</span><span class="n">complex_in</span><span class="p">);</span>
|
|
|
|
<span class="n">Datum</span>
|
|
<span class="n">complex_in</span><span class="p">(</span><span class="n">PG_FUNCTION_ARGS</span><span class="p">)</span>
|
|
<span class="err">{</span>
|
|
<span class="w"> </span><span class="nb">char</span><span class="w"> </span><span class="o">*</span><span class="n">str</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">PG_GETARG_CSTRING</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">double</span><span class="w"> </span><span class="n">x</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">y</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">Complex</span><span class="w"> </span><span class="o">*</span><span class="k">result</span><span class="p">;</span>
|
|
|
|
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">sscanf</span><span class="p">(</span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="ss">" ( %lf , %lf )"</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">y</span><span class="p">)</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="n">ereport</span><span class="p">(</span><span class="n">ERROR</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="p">(</span><span class="n">errcode</span><span class="p">(</span><span class="n">ERRCODE_INVALID_TEXT_REPRESENTATION</span><span class="p">),</span>
|
|
<span class="w"> </span><span class="n">errmsg</span><span class="p">(</span><span class="ss">"invalid input syntax for complex: \"</span><span class="o">%</span><span class="n">s</span><span class="err">\</span><span class="ss">""</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">str</span><span class="p">)));</span>
|
|
|
|
<span class="w"> </span><span class="k">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Complex</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="n">palloc</span><span class="p">(</span><span class="n">sizeof</span><span class="p">(</span><span class="n">Complex</span><span class="p">));</span>
|
|
<span class="w"> </span><span class="k">result</span><span class="o">-></span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="k">result</span><span class="o">-></span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">PG_RETURN_POINTER</span><span class="p">(</span><span class="k">result</span><span class="p">);</span>
|
|
<span class="err">}</span>
|
|
|
|
<span class="c1">-- Define an output function:</span>
|
|
<span class="n">PG_FUNCTION_INFO_V1</span><span class="p">(</span><span class="n">complex_out</span><span class="p">);</span>
|
|
|
|
<span class="n">Datum</span>
|
|
<span class="n">complex_out</span><span class="p">(</span><span class="n">PG_FUNCTION_ARGS</span><span class="p">)</span>
|
|
<span class="err">{</span>
|
|
<span class="w"> </span><span class="n">Complex</span><span class="w"> </span><span class="o">*</span><span class="n">complex</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Complex</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="n">PG_GETARG_POINTER</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="nb">char</span><span class="w"> </span><span class="o">*</span><span class="k">result</span><span class="p">;</span>
|
|
|
|
<span class="w"> </span><span class="k">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="nb">char</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="n">palloc</span><span class="p">(</span><span class="mi">100</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">snprintf</span><span class="p">(</span><span class="k">result</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">,</span><span class="w"> </span><span class="ss">"(%g,%g)"</span><span class="p">,</span><span class="w"> </span><span class="n">complex</span><span class="o">-></span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">complex</span><span class="o">-></span><span class="n">y</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">PG_RETURN_CSTRING</span><span class="p">(</span><span class="k">result</span><span class="p">);</span>
|
|
<span class="err">}</span>
|
|
|
|
<span class="c1">-- Define a receive function:</span>
|
|
<span class="n">PG_FUNCTION_INFO_V1</span><span class="p">(</span><span class="n">complex_recv</span><span class="p">);</span>
|
|
|
|
<span class="n">Datum</span>
|
|
<span class="n">complex_recv</span><span class="p">(</span><span class="n">PG_FUNCTION_ARGS</span><span class="p">)</span>
|
|
<span class="err">{</span>
|
|
<span class="w"> </span><span class="n">StringInfo</span><span class="w"> </span><span class="n">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">StringInfo</span><span class="p">)</span><span class="w"> </span><span class="n">PG_GETARG_POINTER</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">Complex</span><span class="w"> </span><span class="o">*</span><span class="k">result</span><span class="p">;</span>
|
|
|
|
<span class="w"> </span><span class="k">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Complex</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="n">palloc</span><span class="p">(</span><span class="n">sizeof</span><span class="p">(</span><span class="n">Complex</span><span class="p">));</span>
|
|
<span class="w"> </span><span class="k">result</span><span class="o">-></span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pq_getmsgfloat8</span><span class="p">(</span><span class="n">buf</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="k">result</span><span class="o">-></span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pq_getmsgfloat8</span><span class="p">(</span><span class="n">buf</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">PG_RETURN_POINTER</span><span class="p">(</span><span class="k">result</span><span class="p">);</span>
|
|
<span class="err">}</span>
|
|
|
|
<span class="c1">-- Define a send function:</span>
|
|
<span class="n">PG_FUNCTION_INFO_V1</span><span class="p">(</span><span class="n">complex_send</span><span class="p">);</span>
|
|
|
|
<span class="n">Datum</span>
|
|
<span class="n">complex_send</span><span class="p">(</span><span class="n">PG_FUNCTION_ARGS</span><span class="p">)</span>
|
|
<span class="err">{</span>
|
|
<span class="w"> </span><span class="n">Complex</span><span class="w"> </span><span class="o">*</span><span class="n">complex</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Complex</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="n">PG_GETARG_POINTER</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">StringInfoData</span><span class="w"> </span><span class="n">buf</span><span class="p">;</span>
|
|
|
|
<span class="w"> </span><span class="n">pq_begintypsend</span><span class="p">(</span><span class="o">&</span><span class="n">buf</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">pq_sendfloat8</span><span class="p">(</span><span class="o">&</span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="n">complex</span><span class="o">-></span><span class="n">x</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">pq_sendfloat8</span><span class="p">(</span><span class="o">&</span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="n">complex</span><span class="o">-></span><span class="n">y</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">PG_RETURN_BYTEA_P</span><span class="p">(</span><span class="n">pq_endtypsend</span><span class="p">(</span><span class="o">&</span><span class="n">buf</span><span class="p">));</span>
|
|
<span class="err">}</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="section" id="EN-US_TOPIC_0000001188429088__s48ac24de248548f39fad81b5da52a512"><h4 class="sectiontitle">Helpful Links</h4><p id="EN-US_TOPIC_0000001188429088__a9a16e3e81293491a9da98c6f40f09b23"><a href="dws_06_0148.html">ALTER TYPE</a>, <a href="dws_06_0213.html">DROP TYPE</a></p>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div class="familylinks">
|
|
<div class="parentlink"><strong>Parent topic:</strong> <a href="dws_06_0118.html">DDL Syntax</a></div>
|
|
</div>
|
|
</div>
|
|
|