8. È®Àå SQL : Çü (Type)

¾Õ¿¡¼­ »ìÆìº¸¾ÒÁö¸¸, POSTGRES ¿¡´Â µÎ Á¾·ùÀÇ µ¥ÀÌÅÍ ÇüÀÌ ÀÖ´Ù. ±âº»(base)Çü (ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡ Á¤ÀǵǾî ÀÖ´Â Çü)°ú º¹ÇÕ(composite)Çü(ÀνºÅϽº)°¡ ÀÖ´Ù. ¿©±â¿¡ ³ª¿À´Â ¿¹Á¦µéÀº complex.sql °ú complex.c ¿¡ ³ª¿ÍÀÖ´Ù. º¹ÇÕ ¿¹Á¦´Â funcs.sql ¿¡ ³ª¿ÍÀÖ´Ù.

8.1 »ç¿ëÀÚ Á¤ÀÇ Çü

»ç¿ëÀÚ Á¤ÀÇ ÇüÀº ¹Ýµå½Ã 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 ´Â ÀÚµ¿ÀûÀ¸·Î ÇØ´ç ÇüÀÇ ¹è¿­À» Á¦°øÇÑ´Ù. ÀüÅëÀûÀ¸·Î, ¹è¿­ÇüÀÇ À̸§Àº »ç¿ëÀÚ Á¤ÀÇ ÇüÀÇ ¸íĪ¾Õ¿¡ ¹ØÁÙ ¹®ÀÚ '_' °¡ ¾Õ¿¡ À§Ä¡ÇÏ´Â ÇüŰ¡ µÈ´Ù.

º¹ÇÕÇüÀº ¾î¶°ÇÑ ÇÔ¼öµµ ÇÊ¿äÇÏÁö ¾Ê´Ù. ½Ã½ºÅÛÀº ÀÌ¹Ì ÀÌµé ³»ºÎ¸¦ ÀÌÇØÇϱ⠶§¹® ÀÌ´Ù.

8.1.2 ´ëÇü °´Ã¼

Áö±Ý±îÁö ³íÀÇÇÑ ÇüÀº ¸ðµÎ "¼ÒÇü(small)" °´Ã¼À̸ç 8KB (ÁÖ7) º¸´Ù ÀÛÀº °ÍµéÀÌ´Ù. ¹®¼­È­ ½Ã½ºÅÛÀ̳ª ºñÆ®¸Ê ÀúÀå ½Ã½ºÅÛ°ú °°Àº ´ëÇü ÇüÀÌ ÇÊ¿äÇÏ´Ù¸é, POSTGRES ´ëÇü°´Ã¼ (large object) ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÒ Çʿ䰡 ÀÖÀ» °ÍÀÌ´Ù.

ÁÖ7) 8 * 1024 ´Â 8192 ¹ÙÀÌÆ®ÀÌ´Ù. POSTGRES ÀÇ tuple °ú ÆäÀÌÁö ¿À¹öÇìµå´Â ÀÌ·¯ÇÑ 8KB ÇѰ迡 ÀûÇÕÇØ¾ß Çϱ⠶§¹®¿¡ ½ÇÁ¦·Î ÇϳªÀÇ ÇüÀº 8192 ¹ÙÀÌÆ®º¸´Ù ÀÛ°Ô °í·ÁµÇ¾î¾ß ÇÑ´Ù. ÀÌ¿¡ ÀûÇÕÇÑ ½ÇÁ¦ °ªÀº ÇØ´ç ±â°èÀÇ ¾ÆÅ°ÅØÃÄ¿¡ ÀÇÁ¸ ÀûÀÌ´Ù.