PostgreSQL解読室:
heap_fill_tuple()/postgresql-8.1.4
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
このページを編集する際は、[[編集に関する方針]]に従ってく...
*概要 [#a77af665]
-対象:8.1.4
-言語:C
-[[postgresql-8.1.4/src/include/access/heapam.h]]にて定義
-[[postgresql-8.1.4/src/backend/access/common/heaptuple.c...
-(概要を書いてください。)
*引数 [#fc54d74b]
+tupleDesc : TupleDesc型
+values : Datum型へのポインタ
+isnull : bool型へのポインタ
+data : char型へのポインタ
+infomask : uint16型へのポインタ
+bit : bits8型へのポインタ
*実装 [#u02a6be4]
void
heap_fill_tuple(TupleDesc tupleDesc,
-以下のメンバを持つ構造体。詳細は[[TupleDesc/postgresql-8...
-nattsを、intとして定義。
-attrsを、以下のメンバを持つ構造体Form_pg_attributeへのポ...
--attrelidを、Oid(unsigned intの別名)として定義。
--attnameを、以下のメンバを持つ構造体NameDataとして定義。
---dataを、サイズNAMEDATALENのchar配列として定義。
---alignmentDummyを、intとして定義。
--atttypidを、Oid(unsigned intの別名)として定義。
--attstattargetを、int4(int32(signed int)の別名)として...
--attlenを、int2(int16(signed short)の別名)として定義。
--attnumを、int2(int16(signed short)の別名)として定義。
--attndimsを、int4(int32(signed int)の別名)として定義。
--attcacheoffを、int4(int32(signed int)の別名)として定...
--atttypmodを、int4(int32(signed int)の別名)として定義。
--attbyvalを、bool(charの別名)として定義。
--attstorageを、charとして定義。
--attalignを、charとして定義。
--attnotnullを、bool(charの別名)として定義。
--atthasdefを、bool(charの別名)として定義。
--attisdroppedを、bool(charの別名)として定義。
--attislocalを、bool(charの別名)として定義。
--attinhcountを、int4(int32(signed int)の別名)として定...
-constrを、TupleConstrへのポインタとして定義。
--defvalを、以下のメンバを持つ構造体AttrDefaultへのポイン...
---adnumを、AttrNumber(int16(signed shortの別名)の別名...
---adbinを、charへのポインタとして定義。
--checkを、以下のメンバを持つ構造体ConstrCheckへのポイン...
---ccnameを、charへのポインタとして定義。
---ccbinを、charへのポインタとして定義。
--num_defvalを、uint16(unsigned shortの別名)として定義。
--num_checkを、uint16(unsigned shortの別名)として定義。
--has_not_nullを、bool(charの別名)として定義。
-tdtypeidを、Oid(unsigned intの別名)として定義。
-tdtypmodを、int32(signed intの別名)として定義。
-tdhasoidを、bool(charの別名)として定義。
Datum *values,
-unsigned longの別名。詳細は[[Datum/postgresql-8.1.4]]参...
bool *isnull,
-charの別名。詳細は[[bool/postgresql-8.1.4]]参照。
char *data,
uint16 *infomask,
-unsigned shortの別名。詳細は[[uint16/postgresql-8.1.4]]...
bits8 *bit)
-uint8(unsigned char)の別名。詳細は[[bits8/postgresql-8.1...
{
bits8 *bitP;
-uint8(unsigned char)の別名。詳細は[[bits8/postgresql-8.1...
int bitmask;
int i;
int numberOfAttributes = tupleDesc->natts;
Form_pg_attribute *att = tupleDesc->attrs;
-以下のメンバを持つ構造体へのポインタ。詳細は[[Form_pg_at...
--attrelidを、Oid(unsigned intの別名)として定義。
--attnameを、以下のメンバを持つ構造体NameDataとして定義。
---dataを、サイズNAMEDATALENのchar配列として定義。
---alignmentDummyを、intとして定義。
--atttypidを、Oid(unsigned intの別名)として定義。
--attstattargetを、int4(int32(signed int)の別名)として...
--attlenを、int2(int16(signed short)の別名)として定義。
--attnumを、int2(int16(signed short)の別名)として定義。
--attndimsを、int4(int32(signed int)の別名)として定義。
--attcacheoffを、int4(int32(signed int)の別名)として定...
--atttypmodを、int4(int32(signed int)の別名)として定義。
--attbyvalを、bool(charの別名)として定義。
--attstorageを、charとして定義。
--attalignを、charとして定義。
--attnotnullを、bool(charの別名)として定義。
--atthasdefを、bool(charの別名)として定義。
--attisdroppedを、bool(charの別名)として定義。
--attislocalを、bool(charの別名)として定義。
--attinhcountを、int4(int32(signed int)の別名)として定...
if (bit != NULL)
{
bitP = &bit[-1];
bitmask = CSIGNBIT;
}
else
{
/* just to keep compiler quiet */
bitP = NULL;
bitmask = 0;
}
*infomask &= ~(HEAP_HASNULL | HEAP_HASVARWIDTH | HEAP_HA...
-定数0x0001の別名。[[HEAP_HASNULL/postgresql-8.1.4]]参照。
-定数0x0002の別名。[[HEAP_HASVARWIDTH/postgresql-8.1.4]]...
-定数0x000Cの別名。[[HEAP_HASEXTENDED/postgresql-8.1.4]]...
for (i = 0; i < numberOfAttributes; i++)
{
Size data_length;
if (bit != NULL)
{
if (bitmask != CSIGNBIT)
-定数0x80の別名。[[CSIGNBIT/postgresql-8.1.4]]参照。
bitmask <<= 1;
else
{
bitP += 1;
*bitP = 0x0;
bitmask = 1;
}
if (isnull[i])
{
*infomask |= HEAP_HASNULL;
-定数0x0001の別名。[[HEAP_HASNULL/postgresql-8.1.4]]参照。
continue;
}
*bitP |= bitmask;
}
/* XXX we are aligning the pointer itself, not the offs...
data = (char *) att_align((long) data, att[i]->attalign);
-以下の値を取得。詳細は[[att_align()/postgresql-8.1.4]]参...
--att[i]->attalignの値が'i'の場合、data以上であるALIGNOF_...
--att[i]->attalignの値が'c'の場合、dataを(long型にキャス...
--att[i]->attalignの値が'd'の場合、data以上であるALIGNOF_...
--それ以外の場合、data_length以上であるALIGNOF_SHORTの倍...
。ただし、USE_ASSERT_CHECKING指定してコンパイルしたバイナ...
if (att[i]->attbyval)
{
/* pass-by-value */
store_att_byval(data, values[i], att[i]->attlen);
-[[store_att_byval()/postgresql-8.1.4]]参照。
data_length = att[i]->attlen;
}
else if (att[i]->attlen == -1)
{
/* varlena */
*infomask |= HEAP_HASVARWIDTH;
-定数0x0002の別名。[[HEAP_HASVARWIDTH/postgresql-8.1.4]]...
if (VARATT_IS_EXTERNAL(values[i]))
-[[VARATT_IS_EXTERNAL()/postgresql-8.1.4]]参照。
*infomask |= HEAP_HASEXTERNAL;
-[[HEAP_HASEXTERNAL/postgresql-8.1.4]]参照。
if (VARATT_IS_COMPRESSED(values[i]))
-[[VARATT_IS_COMPRESSED()/postgresql-8.1.4]]参照。
*infomask |= HEAP_HASCOMPRESSED;
-[[HEAP_HASCOMPRESSED/postgresql-8.1.4]]参照。
data_length = VARATT_SIZE(DatumGetPointer(values[i]));
-[[VARATT_SIZE()/postgresql-8.1.4]]参照。
-[[DatumGetPointer()/postgresql-8.1.4]]参照。
memcpy(data, DatumGetPointer(values[i]), data_length);
-[[DatumGetPointer()/postgresql-8.1.4]]参照。
}
else if (att[i]->attlen == -2)
{
/* cstring */
*infomask |= HEAP_HASVARWIDTH;
-[[HEAP_HASVARWIDTH/postgresql-8.1.4]]参照。
data_length = strlen(DatumGetCString(values[i])) + 1;
-[[DatumGetCString()/postgresql-8.1.4]]参照。
memcpy(data, DatumGetPointer(values[i]), data_length);
-[[DatumGetPointer()/postgresql-8.1.4]]参照。
}
else
{
/* fixed-length pass-by-reference */
Assert(att[i]->attlen > 0);
-[[Assert()/postgresql-8.1.4]]参照。
data_length = att[i]->attlen;
memcpy(data, DatumGetPointer(values[i]), data_length);
-[[DatumGetPointer()/postgresql-8.1.4]]参照。
}
data += data_length;
}
}
*呼出元 [#mfbc079c]
-(呼出元の関数を書いてください。)
*備考 [#q52e2952]
* heap_fill_tuple
* Load data portion of a tuple from values/isnull arrays
*
* We also fill the null bitmap (if any) and set the info...
* that reflect the tuple's data contents.
*履歴 [#r25afc1f]
-作者:[[testnoda/ページ作者]]
-日付:????/??/??
|更新日|更新者|更新内容|
|2007/4/24|[[testnoda/ページ作者]]|解読を一旦中止([[関数...
||||
終了行:
このページを編集する際は、[[編集に関する方針]]に従ってく...
*概要 [#a77af665]
-対象:8.1.4
-言語:C
-[[postgresql-8.1.4/src/include/access/heapam.h]]にて定義
-[[postgresql-8.1.4/src/backend/access/common/heaptuple.c...
-(概要を書いてください。)
*引数 [#fc54d74b]
+tupleDesc : TupleDesc型
+values : Datum型へのポインタ
+isnull : bool型へのポインタ
+data : char型へのポインタ
+infomask : uint16型へのポインタ
+bit : bits8型へのポインタ
*実装 [#u02a6be4]
void
heap_fill_tuple(TupleDesc tupleDesc,
-以下のメンバを持つ構造体。詳細は[[TupleDesc/postgresql-8...
-nattsを、intとして定義。
-attrsを、以下のメンバを持つ構造体Form_pg_attributeへのポ...
--attrelidを、Oid(unsigned intの別名)として定義。
--attnameを、以下のメンバを持つ構造体NameDataとして定義。
---dataを、サイズNAMEDATALENのchar配列として定義。
---alignmentDummyを、intとして定義。
--atttypidを、Oid(unsigned intの別名)として定義。
--attstattargetを、int4(int32(signed int)の別名)として...
--attlenを、int2(int16(signed short)の別名)として定義。
--attnumを、int2(int16(signed short)の別名)として定義。
--attndimsを、int4(int32(signed int)の別名)として定義。
--attcacheoffを、int4(int32(signed int)の別名)として定...
--atttypmodを、int4(int32(signed int)の別名)として定義。
--attbyvalを、bool(charの別名)として定義。
--attstorageを、charとして定義。
--attalignを、charとして定義。
--attnotnullを、bool(charの別名)として定義。
--atthasdefを、bool(charの別名)として定義。
--attisdroppedを、bool(charの別名)として定義。
--attislocalを、bool(charの別名)として定義。
--attinhcountを、int4(int32(signed int)の別名)として定...
-constrを、TupleConstrへのポインタとして定義。
--defvalを、以下のメンバを持つ構造体AttrDefaultへのポイン...
---adnumを、AttrNumber(int16(signed shortの別名)の別名...
---adbinを、charへのポインタとして定義。
--checkを、以下のメンバを持つ構造体ConstrCheckへのポイン...
---ccnameを、charへのポインタとして定義。
---ccbinを、charへのポインタとして定義。
--num_defvalを、uint16(unsigned shortの別名)として定義。
--num_checkを、uint16(unsigned shortの別名)として定義。
--has_not_nullを、bool(charの別名)として定義。
-tdtypeidを、Oid(unsigned intの別名)として定義。
-tdtypmodを、int32(signed intの別名)として定義。
-tdhasoidを、bool(charの別名)として定義。
Datum *values,
-unsigned longの別名。詳細は[[Datum/postgresql-8.1.4]]参...
bool *isnull,
-charの別名。詳細は[[bool/postgresql-8.1.4]]参照。
char *data,
uint16 *infomask,
-unsigned shortの別名。詳細は[[uint16/postgresql-8.1.4]]...
bits8 *bit)
-uint8(unsigned char)の別名。詳細は[[bits8/postgresql-8.1...
{
bits8 *bitP;
-uint8(unsigned char)の別名。詳細は[[bits8/postgresql-8.1...
int bitmask;
int i;
int numberOfAttributes = tupleDesc->natts;
Form_pg_attribute *att = tupleDesc->attrs;
-以下のメンバを持つ構造体へのポインタ。詳細は[[Form_pg_at...
--attrelidを、Oid(unsigned intの別名)として定義。
--attnameを、以下のメンバを持つ構造体NameDataとして定義。
---dataを、サイズNAMEDATALENのchar配列として定義。
---alignmentDummyを、intとして定義。
--atttypidを、Oid(unsigned intの別名)として定義。
--attstattargetを、int4(int32(signed int)の別名)として...
--attlenを、int2(int16(signed short)の別名)として定義。
--attnumを、int2(int16(signed short)の別名)として定義。
--attndimsを、int4(int32(signed int)の別名)として定義。
--attcacheoffを、int4(int32(signed int)の別名)として定...
--atttypmodを、int4(int32(signed int)の別名)として定義。
--attbyvalを、bool(charの別名)として定義。
--attstorageを、charとして定義。
--attalignを、charとして定義。
--attnotnullを、bool(charの別名)として定義。
--atthasdefを、bool(charの別名)として定義。
--attisdroppedを、bool(charの別名)として定義。
--attislocalを、bool(charの別名)として定義。
--attinhcountを、int4(int32(signed int)の別名)として定...
if (bit != NULL)
{
bitP = &bit[-1];
bitmask = CSIGNBIT;
}
else
{
/* just to keep compiler quiet */
bitP = NULL;
bitmask = 0;
}
*infomask &= ~(HEAP_HASNULL | HEAP_HASVARWIDTH | HEAP_HA...
-定数0x0001の別名。[[HEAP_HASNULL/postgresql-8.1.4]]参照。
-定数0x0002の別名。[[HEAP_HASVARWIDTH/postgresql-8.1.4]]...
-定数0x000Cの別名。[[HEAP_HASEXTENDED/postgresql-8.1.4]]...
for (i = 0; i < numberOfAttributes; i++)
{
Size data_length;
if (bit != NULL)
{
if (bitmask != CSIGNBIT)
-定数0x80の別名。[[CSIGNBIT/postgresql-8.1.4]]参照。
bitmask <<= 1;
else
{
bitP += 1;
*bitP = 0x0;
bitmask = 1;
}
if (isnull[i])
{
*infomask |= HEAP_HASNULL;
-定数0x0001の別名。[[HEAP_HASNULL/postgresql-8.1.4]]参照。
continue;
}
*bitP |= bitmask;
}
/* XXX we are aligning the pointer itself, not the offs...
data = (char *) att_align((long) data, att[i]->attalign);
-以下の値を取得。詳細は[[att_align()/postgresql-8.1.4]]参...
--att[i]->attalignの値が'i'の場合、data以上であるALIGNOF_...
--att[i]->attalignの値が'c'の場合、dataを(long型にキャス...
--att[i]->attalignの値が'd'の場合、data以上であるALIGNOF_...
--それ以外の場合、data_length以上であるALIGNOF_SHORTの倍...
。ただし、USE_ASSERT_CHECKING指定してコンパイルしたバイナ...
if (att[i]->attbyval)
{
/* pass-by-value */
store_att_byval(data, values[i], att[i]->attlen);
-[[store_att_byval()/postgresql-8.1.4]]参照。
data_length = att[i]->attlen;
}
else if (att[i]->attlen == -1)
{
/* varlena */
*infomask |= HEAP_HASVARWIDTH;
-定数0x0002の別名。[[HEAP_HASVARWIDTH/postgresql-8.1.4]]...
if (VARATT_IS_EXTERNAL(values[i]))
-[[VARATT_IS_EXTERNAL()/postgresql-8.1.4]]参照。
*infomask |= HEAP_HASEXTERNAL;
-[[HEAP_HASEXTERNAL/postgresql-8.1.4]]参照。
if (VARATT_IS_COMPRESSED(values[i]))
-[[VARATT_IS_COMPRESSED()/postgresql-8.1.4]]参照。
*infomask |= HEAP_HASCOMPRESSED;
-[[HEAP_HASCOMPRESSED/postgresql-8.1.4]]参照。
data_length = VARATT_SIZE(DatumGetPointer(values[i]));
-[[VARATT_SIZE()/postgresql-8.1.4]]参照。
-[[DatumGetPointer()/postgresql-8.1.4]]参照。
memcpy(data, DatumGetPointer(values[i]), data_length);
-[[DatumGetPointer()/postgresql-8.1.4]]参照。
}
else if (att[i]->attlen == -2)
{
/* cstring */
*infomask |= HEAP_HASVARWIDTH;
-[[HEAP_HASVARWIDTH/postgresql-8.1.4]]参照。
data_length = strlen(DatumGetCString(values[i])) + 1;
-[[DatumGetCString()/postgresql-8.1.4]]参照。
memcpy(data, DatumGetPointer(values[i]), data_length);
-[[DatumGetPointer()/postgresql-8.1.4]]参照。
}
else
{
/* fixed-length pass-by-reference */
Assert(att[i]->attlen > 0);
-[[Assert()/postgresql-8.1.4]]参照。
data_length = att[i]->attlen;
memcpy(data, DatumGetPointer(values[i]), data_length);
-[[DatumGetPointer()/postgresql-8.1.4]]参照。
}
data += data_length;
}
}
*呼出元 [#mfbc079c]
-(呼出元の関数を書いてください。)
*備考 [#q52e2952]
* heap_fill_tuple
* Load data portion of a tuple from values/isnull arrays
*
* We also fill the null bitmap (if any) and set the info...
* that reflect the tuple's data contents.
*履歴 [#r25afc1f]
-作者:[[testnoda/ページ作者]]
-日付:????/??/??
|更新日|更新者|更新内容|
|2007/4/24|[[testnoda/ページ作者]]|解読を一旦中止([[関数...
||||
ページ名: