¾Õ¿¡¼ »ìÆìº¸¾ÒÁö¸¸, POSTGRES ¿¡´Â µÎ Á¾·ùÀÇ µ¥ÀÌÅÍ ÇüÀÌ ÀÖ´Ù. ±âº»(base)Çü (ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡ Á¤ÀǵǾî ÀÖ´Â Çü)°ú º¹ÇÕ(composite)Çü(ÀνºÅϽº)°¡ ÀÖ´Ù. ¿©±â¿¡ ³ª¿À´Â ¿¹Á¦µéÀº complex.sql °ú complex.c ¿¡ ³ª¿ÍÀÖ´Ù. º¹ÇÕ ¿¹Á¦´Â funcs.sql ¿¡ ³ª¿ÍÀÖ´Ù.
»ç¿ëÀÚ Á¤ÀÇ ÇüÀº ¹Ýµå½Ã input, output ÇÔ¼ö¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ ÇÔ¼ö ´Â ÇüÀÌ (»ç¿ëÀÚ°¡ ÀÔ·ÂÇÏ°í »ç¿ëÀÚ¿¡°Ô Ãâ·ÂµÇ´Â)¹®ÀÚ¿¿¡ ¾î¶»°Ô ³ªÅ¸³ª´Â Áö¿Í ÇØ´ç ÇüÀÌ ¸Þ¸ð¸®¿¡ ¾î¶»°Ô ÆíÀçµÇ´ÂÁö¸¦ °Ë»çÇÑ´Ù. ÀÔ·ÂÇÔ¼ö´Â ³Î·Î ³¡³ª´Â ¹®ÀÚ ¿À» ÀÔ·ÂÀ¸·Î ¹Þ¾Æµé¿©¼ ÇØ´ç ÇüÀÇ ³»ºÎÀûÀΠǥÇöÀ» ¹ÝȯÇÑ´Ù. Ãâ·ÂÇÔ¼ö´Â ÇØ´ç ÇüÀÇ ³»ºÎÀûÀΠǥÇöÀ» ¹Þ¾Æµé¿©¼ ³Î·Î ³¡³ª´Â ¹®ÀÚ¿À» ¹ÝȯÇÑ´Ù.
º¹ÇÕ ¼ýÀÚ¸¦ Ç¥ÇöÇÏ´Â complex µ¥ÀÌÅÍ ÇüÀ» Á¤ÀÇÇØº¸ÀÚ. ÀÌ º¹ÇÕÇüÀ» ¸Þ¸ð¸®¿¡ Ç¥ ÇöÇϱâ À§ÇØ ÀÚ¿¬½º·´°Ô ´ÙÀ½ÀÇ C ±¸Á¶Ã¼¸¦ ¼±ÅÃÇÒ °ÍÀÌ´Ù.
typedef struct Complex { double x; double y; } Complex;
(x,y) ÇüÅÂÀÇ ¹®ÀÚ¿Àº ¿ÜºÎÀûÀÎ ¹®ÀÚ¿·Î Ç¥ÇöµÈ´Ù.
ÀÌ·¯ÇÑÇÔ¼ö´Â º¸Åë ÀÛ¼ºÇϱⰡ ½¬¿ì¸ç, ƯÈ÷ Ãâ·ÂÇÔ¼ö´Â ´õ ½±´Ù. ±×·¯³ª, ¿©±â¿¡¼ ±â¾ïÇØ¾ß ÇÒ ¸î°¡Áö »çÇ×ÀÌ ÀÖ´Ù.
(1) ¿ÜºÎÀûÀÎ (¹®ÀÚ¿) Ç¥ÇöÀ» Á¤ÀÇÇÒ ¶§, ÃÖÁ¾ÀûÀ¸·Î ÀÔ·ÂÇÔ¼ö°¡ ÇØ´ç Ç¥ÇöÀ» Àß ¹Þ¾ÆµéÀÌ´Â ¿Ïº®ÇÏ°í Æ°Æ°ÇÑ ºÐ¼®±â°¡ µÇµµ·Ï ÇØ¾ß ÇÑ´Ù´Â Á¡À» ±â¾ïÇÏÀÚ!
Complex * complex_in(char *str)
{
double x, y;
Complex *result;
if (sscanf(str, " ( %1f , %1f )", &x, &y) != 2)
{
elog(WARN, "complex_in: error in parsing \"%s\"", str);
return NULL;
}
result = (Complex *) palloc(sizeof(Complex));
result->x = x;
result->y = y;
return (result);
}
Ãâ·ÂÇÔ¼ö´Â ´õ¿í °£´ÜÇÏ°Ô ¸¸µé ¼ö ÀÖ´Ù.
char * complex_out(Complex *complex)
{
char *result;
if (complex == NULL) return(NULL);
result = (char *) palloc(60);
sprintf(result, "(%g,%g)", complex->x, complex->y);
return(result);
}
(2) ÀÔ·Â, Ãâ·Â ÇÔ¼ö¸¦ ¸¸µé ¶§ ¼·Î ¿ªÀ¸·Î ¸¸µé¾î º¸´Â °ÍÀ» ½ÃµµÇغ¸¾Æ¾ß ÇÑ´Ù. ¸¸ÀÏ ÀÌ·¸°Ô ÇÏÁö ¾ÊÀ» °æ¿ì¿¡´Â, ÇØ´ç µ¥ÀÌÅ͸¦ ÆÄÀÏ¿¡ ´ýÇÁÇϰųª (´Ù¸¥ ½Ã ½ºÅÛ»óÀÇ ¾î¶² ´Ù¸¥ µ¥ÀÌÅͺ£À̽º·Î) °Å²Ù·Î ÀоîµéÀÏ ¶§ ¿©·¯°¡Áö ¹®Á¦°¡ ¹ß »ýÇÒ °ÍÀÌ´Ù. ƯÈ÷ ºÎµ¿ ¼Ò¼öÁ¡À» Æ÷ÇÔÇÒ ¶§ °øÅëÀûÀÎ ¹®Á¦·Î ³ªÅ¸³´Ù.
complex ÇüÀ» ¸¸µé·Á¸é, ÇØ´ç ÇüÀ» ¸¸µé±â ÀÌÀü¿¡ complex_in °ú complex_out ÀÇ µÎ°¡Áö »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö¸¦ ¸¸µé¾î¾ß ÇÑ´Ù.
CREATE FUNCTION complex_in(opaque) RETURNS complex AS '/usr/local/postgres95/tutorial/obj/complex.so' LANGUAGE 'c';
CREATE FUNCTION complex_out(opaque) RETURNS opaque AS '/usr/local/postgres95/tutorial/obj/complex.so' LANGUAGE 'c';
CREATE TYPE complex ( internallength = 16, input = complex_in, output = complex_out );
¾Õ¿¡¼µµ ¸»ÇßÁö¸¸, POSTGRES ´Â ±âº»ÇüÀÇ ¹è¿À» dzÁ·ÇÏ°Ô Á¦°øÇÑ´Ù. ¾Æ¿ï·¯, POSTGRES ´Â »ç¿ëÀÚ Á¤ÀÇ ÇüÀÇ ¹è¿µµ Àß Á¦°øÇÑ´Ù. ÇüÀ» Á¤ÀÇÇÒ ¶§, POSTGRES ´Â ÀÚµ¿ÀûÀ¸·Î ÇØ´ç ÇüÀÇ ¹è¿À» Á¦°øÇÑ´Ù. ÀüÅëÀûÀ¸·Î, ¹è¿ÇüÀÇ À̸§Àº »ç¿ëÀÚ Á¤ÀÇ ÇüÀÇ ¸íĪ¾Õ¿¡ ¹ØÁÙ ¹®ÀÚ '_' °¡ ¾Õ¿¡ À§Ä¡ÇÏ´Â ÇüŰ¡ µÈ´Ù.
º¹ÇÕÇüÀº ¾î¶°ÇÑ ÇÔ¼öµµ ÇÊ¿äÇÏÁö ¾Ê´Ù. ½Ã½ºÅÛÀº ÀÌ¹Ì ÀÌµé ³»ºÎ¸¦ ÀÌÇØÇϱ⠶§¹® ÀÌ´Ù.
Áö±Ý±îÁö ³íÀÇÇÑ ÇüÀº ¸ðµÎ "¼ÒÇü(small)" °´Ã¼À̸ç 8KB (ÁÖ7) º¸´Ù ÀÛÀº °ÍµéÀÌ´Ù. ¹®¼È ½Ã½ºÅÛÀ̳ª ºñÆ®¸Ê ÀúÀå ½Ã½ºÅÛ°ú °°Àº ´ëÇü ÇüÀÌ ÇÊ¿äÇÏ´Ù¸é, POSTGRES ´ëÇü°´Ã¼ (large object) ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÒ Çʿ䰡 ÀÖÀ» °ÍÀÌ´Ù.
ÁÖ7) 8 * 1024 ´Â 8192 ¹ÙÀÌÆ®ÀÌ´Ù. POSTGRES ÀÇ tuple °ú ÆäÀÌÁö ¿À¹öÇìµå´Â ÀÌ·¯ÇÑ 8KB ÇѰ迡 ÀûÇÕÇØ¾ß Çϱ⠶§¹®¿¡ ½ÇÁ¦·Î ÇϳªÀÇ ÇüÀº 8192 ¹ÙÀÌÆ®º¸´Ù ÀÛ°Ô °í·ÁµÇ¾î¾ß ÇÑ´Ù. ÀÌ¿¡ ÀûÇÕÇÑ ½ÇÁ¦ °ªÀº ÇØ´ç ±â°èÀÇ ¾ÆÅ°ÅØÃÄ¿¡ ÀÇÁ¸ ÀûÀÌ´Ù.