µÚËÄÊ®ÕÂ. À©Õ¹µÄ SQL: ²Ù×÷·û

Postgres Ö§³Ö×óÄ¿£¬ÓÒÄ¿ºÍË«Ä¿²Ù×÷·û£®²Ù×÷·û¿ÉÒÔÖØÔØ£¬»òÒÔ²»Í¬ÊýÄ¿»òÀàÐ͵IJÎÊýÖØÐÂʹÓã®Èç¹ûÓÐÓïÒ庬»ì¶øϵͳÎÞ·¨¾ö¶¨Ê¹ÓÃÄĸöÕýÈ·µÄ²Ù×÷·û£¬Ëü½«·µ»ØÒ»¸ö´íÎó¡£Äã¿ÉÄܱØÐëת»»×óºÍ/»òÓÒ²Ù×÷ÊýµÄÀàÐÍÀ´°ïÖúϵͳÃ÷°×ÄãÏëÓõÄÊÇÄĸö²Ù×÷·û£®

ÿ¸ö²Ù×÷·û¶¼ÊǶÔÕæÕý¸É»îµÄ¶ÔÓ¦º¯ÊýµÄ"ÓïÒåÐÞÊÎ"£»ËùÒÔÄãÔÚ´´½¨²Ù×÷·û֮ǰ±ØÐëÏÈ´´½¨¶ÔÓ¦µÄº¯Êý¡£²»¹ý£¬Ò»¸ö²Ù×÷·ûÒ²²¢²»½ö½öÊÇÓïÒåÐÞÊΣ¬ÒòΪËü»¹´ø×Å¿ÉÒÔ°ïÖú²éѯ¹æ»®Æ÷ÓÅ»¯Ê¹ÓøòÙ×÷·ûµÄ²éѯµÄ¸½¼ÓÐÅÏ¢¡£±¾ÕµĴ󲿷ֽ«ÓÃÓÚ½âÊÍÄÇЩ¸½¼ÓÐÅÏ¢¡£

ÏÂÃæÊÇÒ»¸ö´´½¨ÓÃÓÚÁ½¸ö¸´ÊýÏà¼ÓµÄ²Ù×÷·ûµÄÀý×Ó¡£ÎÒÃǼÙÉèÒѾ­´´½¨Á˸´ÊýÀàÐ͵Ķ¨Òå¡£Ê×ÏÈÎÒÃÇÐèÒª×ö£¨Ïà¼Ó£©¹¤×÷µÄº¯Êý£»È»ºóÎÒÃǾͿÉÒÔ¶¨Òå²Ù×÷·û£º

CREATE FUNCTION complex_add(complex, complex)
    RETURNS complex
    AS '$PWD/obj/complex.so'
    LANGUAGE 'c';

CREATE OPERATOR + (
    leftarg = complex,
    rightarg = complex,
    procedure = complex_add,
    commutator = +
);
ÏÖÔÚÎÒÃÇ¿ÉÒÔ£º
SELECT (a + b) AS c FROM test_complex;

+----------------+
|c               |
+----------------+
|(5.2,6.05)      |
+----------------+
|(133.42,144.95) |
+----------------+
ÎÒÃÇÔÚÕâÀïÒѾ­ÑÝʾÁËÈçºÎ´´½¨Á½Ä¿²Ù×÷·û¡£Òª´´½¨µ¥Ä¿²Ù×÷·û£¬Ö»ÐèҪʡÂÔ×ó²Ù×÷Êý£¨¶Ô×óÄ¿²Ù×÷·û£©»òÕßÓÒ²Ù×÷Êý£¨¶ÔÓÒ²Ù×÷·û£©¼´¿É¡£Ö»Óйý³Ì£¨procedure£©×Ó¾äºÍ²ÎÊý£¨argument£©×Ó¾äÊÇ CREATE OPERATOR ÀïÐèÒªµÄÌõÄ¿¡£Àý×ÓÀïÑÝʾµÄ COMMUTATOR ×Ó¾äÊÇÒ»¸ö¸ø²éѯÓÅ»¯Æ÷µÄ¿ÉÑ¡µÄ°µÊ¾¡£¹ØÓÚ COMMUTATOR ºÍÆäËüÓÅ»¯Æ÷°µÊ¾µÄÏêϸÐÅÏ¢ÔÚÏÂÃæ¸ø³ö¡£

²Ù×÷·ûÓÅ»¯ÐÅÏ¢

×÷ÕߣºÓÉ Tom Lane Êéд¡£
Postgres µÄ²Ù×÷·û¶¨Òå¿ÉÒÔ°üÀ¨¼¸¸ö¿ÉÑ¡µÄ×Ӿ䣬ÕâЩ×Ó¾ä¸æËßϵͳһЩ¹ØÓڸòÙ×÷·ûµÄÌØÐÔµÄÓÐÓÃÐÅÏ¢¡£ÔÚ¿ÉÄܵÄÇé¿öÏ£¬ÎÒÃǶ¼Ó¦¸ÃÌṩÕâЩ×Ӿ䣬ÒòΪËüÃÇ¿ÉÄÜΪʹÓÃÕâ¸ö²Ù×÷·ûµÄ²éѯ´øÀ´¿É¹ÛµÄËÙ¶ÈÌáÉý¡£²»¹ýҪעÒâÈç¹ûÄãÉùÃ÷ÁËÕâЩ×Ӿ䣬Äã±ØÐëÈ·±£ËüÃÇÊÇÕýÈ·µÄ£¡¶ÔÓÅ»¯×Ó¾äµÄ´íÎóʹÓý«µ¼Öºó¶ËµÄ±ÀÀ££¬¾«Ï¸µÄÊä³ö´íÎó»òÕßÆäËûÔã¸âÊÂÇé¡£Èç¹ûÄã¶ÔÕâЩÊÂÇ鲻ȷ¶¨µÄ»°£¬Äã¿ÉÒÔ×ÜÊǺöÂÔÓÅ»¯×Ӿ䣻ΨһµÄºó¹ûÊDzéѯ¿ÉÄܱÈÐèÒªµÄÔËÐеÄÂýһЩ¡£

¸½¼ÓµÄÓÅ»¯×Ó¾ä¿ÉÄÜÔÚ½ñºóµÄ Postgres °æ±¾Àï³öÏÖ¡£ÕâÀïÃèÊöµÄ¶¼ÊÇ°æ±¾ 6.5 ¿ÉÒÔÀí½âµÄ¡£

COMMUTATOR£¨»»ÏòÆ÷£©

Èç¹ûÌṩÁË COMMUTATOR ×Ӿ䣬ÔòÃüÃûÒ»¸ö²Ù×÷·ûÊDZ»¶¨ÒåµÄ²Ù×÷·ûµÄ»»ÏòÆ÷¡£Èç¹ûÓÐÁ½¸ö²Ù×÷·û A£¬B£¬¶ÔÓÚÈκοÉÄܵÄÊäÈë x£¬y ¶¼ÓÐ (x A y) µÈÓÚ (y B x)£¬ÄÇôÎÒÃǾÍ˵ A ÊÇ B µÄ»»ÏòÆ÷£¬Í¬Ñù B Ò²ÊÇ A µÄ»»ÏòÆ÷¡£ÀýÈ磬²Ù×÷·û '<' ºÍ '>' ¶ÔÓÚËùʹÓõÄÒ»¶¨µÄÊý¾ÝÀàÐÍͨ³£¶¼ÊǶԷ½µÄ»»ÏòÆ÷£¬¶ø²Ù×÷·û '+' ͨ³£ÊÇËü×ÔÉíµÄ»»ÏòÆ÷¡£µ«ÊDzÙ×÷·û '-' ͨ³£Ã»Óл»ÏòÆ÷¡£

Ò»¸ö±»»»ÏòµÄ²Ù×÷·ûµÄ×ó²Ù×÷·ûÓëËüµÄ»»ÏòÆ÷µÄÓÒ²Ù×÷·ûÏàͬ£¬·´Ö®ÒàÈ»¡£ËùÒÔPostgres ËùÐèÒªµÄÖ»ÊÇÒ»¸ö»»ÏòÆ÷²Ù×÷·ûµÄÃû³ÆÓÃÒÔ²éÕҸû»ÏòÆ÷£¬ÄÇÒ²ÊÇ COMMUTATOR ×Ó¾äÀïËùÐèÒªµÄΨһµÄ¶«Î÷¡£

µ±Ä㶨ÒåÒ»¸ö×Ô»»ÏòµÄ²Ù×÷·ûʱ£¬Ä㶨ÒåËü¾ÍÊÇÁË¡£µ±Ä㶨ÒåÒ»¶Ô»»ÏòÆ÷²Ù×÷·ûʱ£¬ÊÂÇé¾ÍÓÐÒ»µã¼¬ÊÖ£ºÔõÑù¶¨ÒåÒ»¸ö²Ù×÷·ûµÄ»»ÏòÆ÷Ö¸ÏòÁíÒ»¸öÄ㻹ûÓж¨ÒåµÄ²Ù×÷·ûÄØ£¿ÎÒÃǶÔÕâ¸öÎÊÌâÓÐÁ½¸ö½â¾ö·½·¨£º

    ¸ö·½·¨ÊÇÊ¡ÂÔÄ㶨ÒåµÄµÚÒ»¸ö²Ù×÷·ûµÄ COMMUTATOR ×Ӿ䣬ȻºóÔÚµÚ¶þ¸ö²Ù×÷·ûµÄ¶¨ÒåÀïÌṩһ¸ö£¨ COMMUTATOR ×Ӿ䣩¡£ÒòΪ Postgres ÖªµÀ»»Ïò²Ù×÷·ûÊdzɶԳöÏֵģ¬ËùÒÔµ±Ëü¿´µ½µÚ¶þ¸ö¶¨ÒåʱËü»á×Ô¶¯·µ»Ø²¢Ìî³äµÚÒ»¸ö¶¨ÒåÀï¿ÕȱµÄ COMMUTATOR ×Ӿ䡣

    ÁíÒ»¸ö¸üÖ±½ÓµÄ·½·¨ÊÇÔÚÁ½¸ö¶¨ÒåÀïÃ涼°üº¬ COMMUTATOR ×Ӿ䡣µ± Postgres ´¦ÀíµÚÒ»¸ö¶¨Òå²¢Òâʶµ½ COMMUTAOTR Ö¸ÏòÒ»¸ö²»´æÔڵIJÙ×÷·û£¬ÏµÍ³»áÔÚϵͳµÄ pg_operator ±íÀïÃæΪ¸Ã²Ù×÷·û¼Ç¼һ¸öÐéÄâµÄ¼Ç¼¡£Õâ¸öÐéÄâµÄ¼Ç¼ֻÓвÙ×÷·ûÃû£¬×óºÍÓÒ²ÎÊýÀàÐÍÒÔ¼°½á¹ûÀàÐÍÊÇÓÐЧµÄ£¬ÒòΪÕâЩÊǵ½Ä¿Ç°ÎªÖ¹Postgres ¿ÉÒÔÍƵ¼³öÀ´µÄ¶«Î÷¡£µÚÒ»¸ö²Ù×÷·û±í¼Ç¼½«ºÍÕâ¸öÐéÄâ¼Ç¼Áª½Ó¡£ÉԺ󣬵±Ä㶨ÒåµÚ¶þ¸ö²Ù×÷·ûʱ£¬ÏµÍ³½«ÓÃÀ´×ÔµÚ¶þ¸ö²Ù×÷·ûµÄÐÅÏ¢¸üиÃÐéÄâ¼Ç¼¡£Èç¹ûÄãÊÔͼÔÚÐéÄâ²Ù×÷·û±»Ìî³ä֮ǰʹÓÃËü£¬Ä㽫ֻÄÜÊÕµ½Ò»Ìõ´íÎóÐÅÏ¢¡££¨×¢Ò⣺Õâ¸ö¹ý³ÌÔÚPostgres 6.5ÒÔÇ°µÄ°æ±¾²»ÄÜ¿É¿¿µÄ¹¤×÷£¬µ«ÊÇÏÖÔÚÕâÖÖ·½·¨ÊÇÎÒÃÇÍƼöµÄ·½·¨¡££©

NEGATOR£¨·ñ¶¨·û£©

Èç¹ûÌṩÁË NEGATOR ×Ӿ䣬ÔòÃüÃûÒ»¸ö²Ù×÷·ûÊDZ»¶¨ÒåµÄ²Ù×÷·ûµÄ·ñ¶¨·û¡£Èç¹ûÓÐÁ½¸ö¶¼·µ»Ø²¼¶û±äÁ¿µÄ²Ù×÷·û A ºÍ B£¬¶ÔÈκοÉÄܵÄÊäÈë x ºÍ y£¬¶¼ÓÐ (x A y) µÈÓÚ NOT (x B y)£¬ÄÇôÎÒÃÇ˵ A ÊÇ B µÄ·ñ¶¨·û¡£µ±È» B Ò²ÊÇ A µÄ·ñ¶¨·û¡£ÀýÈ磬'<' ºÍ '>=' ¶Ô´ó¶àÊýÊý¾ÝÀàÐÍÊÇÒ»¶Ô·ñ¶¨·û¡£Ò»¸ö²Ù×÷·û²»¿ÉÄÜÊÇËü×ÔÉíµÄÓÐЧ²Ù×÷·û¡£

²»Ïó COMMUTATOR£¬Ò»¶Ôµ¥Ä¿²Ù×÷·û¿ÉÒÔ»¥ÎªÓÐЧµÄ·ñ¶¨·û£»ÄǾÍÒâζ×ŶÔÓÚËùÓÐµÄ x£¬(A x) µÈÓÚ NOT (B x)£¬»òÕßÀàËƵÄÓÒÄ¿²Ù×÷·ûµÄÕâÖÖÇé¿ö¡£

Ò»¸ö²Ù×÷·ûµÄ·ñ¶¨·û±ØÐëÓÐÓڸòÙ×÷·û±¾ÉíÒ»ÑùµÄ×óºÍ/»òÓÒ²ÎÊý£¬ËùÒÔ¾ÍÏó COMMUTATOR Ò»Ñù£¬Ö»ÓвÙ×÷·ûÃûÐèÒªÔÚ NEGATOR ×Ó¾äÀïÃæ¸ø³ö¡£

Ìṩ NEGATOR ¶Ô²éѯÓÅ»¯Æ÷ÊǷdz£ÓаïÖúµÄ£¬ÒòΪÕâÑù¾ÍÔÊÐíÏó NOT (x = y) ÕâÑùµÄ±í´ïʽ¼ò»¯³É x <> y¡£ÕâÑùµÄÇé¿ö±ÈÄãÏëÏóµÄҪƵ·±µÄ¶à£¬ÒòΪ NOT ¿ÉÄÜÒòΪÆäËûµÄÖØÅÅÁжø±»ÒýÈë¡£

·ñ¶¨·û¶Ô¿ÉÒÔÓÃÉÏÃæ»»Ïò·û¶ÔÖнâÊ͵ÄÏàͬµÄ·½·¨À´¶¨Òå¡£

RESTRICT£¨ÏÞÖÆ£©

Èç¹ûÌṩÁË RESTRICT ×Ӿ䣬ÔòΪ²Ù×÷·ûÃüÃûÒ»¸öÑ¡ÔñÐÔÏÞÖƼÆË㺯Êý£¨×¢ÒâÕâÀïÊÇÒ»¸öº¯ÊýÃû£¬¶ø²»ÊÇÒ»¸ö²Ù×÷·ûÃû£©¡£RESTRICT ×Ó¾äÖ»ÊǶԷµ»Ø²¼¶û±äÁ¿µÄË«Ä¿²Ù×÷·ûÓÐÒâÒ塣ѡÔñÐÔÏÞÖƼÆËã·ûµÄ¸ÅÄîÊDz²âÒ»¸ö±íÖÐËùÓÐÐеÄÄÄÒ»²¿·Ö¶ÔÓÚÄ¿Ç°µÄ²Ù×÷·ûºÍÌض¨µÄ³£Á¿½«Âú×ãÒ»¸öÏóÏÂÃæÕâÑùÐÎʽµÄ WHERE Ìõ¼þ×Ó¾ä
                field OP constant
Ëü¿ÉÒÔ¸ø³öÕâÖÖÀàÐ굀 WHERE ×Ó¾ä¿ÉÒÔɾ³ý¶àÉÙÐеÄÒ»¸ö¸ÅÄÕ⽫°ïÖúÓÅ»¯Æ÷½øÐÐÓÅ»¯¡££¨Äã¿ÉÄÜ»á˵£¬Èç¹û¸Ã³£Á¿£¨constant£©ÔÚ×ó±ßÔõô°ì£¿Å¶£¬ÄÇÊÇ COMMUTATOR ¸ÉµÄÊÂ...£©

ÊéдеÄÑ¡ÔñÐÔÏÞÖƼÆË㺯ÊýÔ¶Ô¶³¬³öÁ˱¾Õµķ¶Î§£¬²»¹ýºÜÐÒÔ˵ÄÊÇ£¬Í¨³£Äã¶Ô×Ô¼ºµÄ²Ù×÷·ûÖ»ÐèҪʹÓÃϵͳ±ê×¼µÄ¼ÆËãÆ÷Ö®Ò»¾ÍÐÐÁË¡£ÏÂÃæÊÇһЩ±ê×¼ÏÞÖƼÆËãÆ÷£º

        eqsel           for =
        neqsel          for <>
        scalarltsel     for < or <=
        scalargtsel     for > or >=
ÕâЩ¶¼ÊÇ·ÖÀ࣬¿´ÆðÀ´ÓеãÆæ¹Ö£¬²»¹ýÈç¹ûÄã×ÐϸÏëÏ룬¾Í»á¾õµÃÓеÀÀí¡£'=' ´ó¶à½«Ö»½ÓÊܱíÖеÄһС²¿·ÖÐУ»'<>' ´ó¶à½«¾Ü¾øһС²¿·ÖÐС£'<' ½«½ÓÊܵÄÐÐÈ¡¾öÓÚ¸ø³öµÄ³£Á¿ÂäÔÚ±íµÄ¸ÃÁÐÊý¾ÝÖµµÄÄÄÒ»¸ö·¶Î§À¸ÃÖµÅöÇÉÊÇ VACUUM ANALYZE ÊÕ¼¯²¢ÇÒÌṩ¸øÑ¡ÔñÐÔ¼ÆËãÆ÷µÄÐÅÏ¢£©¡£'<=' ÔÚͬÑùµÄ³£Á¿Ê±»á½ÓÊÜ±È '<' ÂÔ΢´óһЩµÄÐУ¬²»¹ýËüÃÇÒ²·Ç³£½Ó½ü£¬¼¸ºõ²»ÖµµÃÇø±ð¿ªÀ´£¬ÓÈÆäÊÇÎÞÂÛÈçºÎÎÒÃÇÒ²±È×öä²ÂºÃµÃ¶à¡£ÀàËƵÄÇé¿öÒ²ÊÊÓÃÓÚ '>' ºÍ '>='¡£

Äã¿ÉÄܳ£Ï°¹ßÓÚ°Ñ eqsel »òÕß neqsel ÓÃÓÚÄÇЩ·Ç³£¸ß»òÕ߷dz£µÍÑ¡ÔñÐԵIJÙ×÷·û£¬¼´Ê¹ËüÃDz¢·ÇÕæÕýÏàµÈ»òÕß²»ÏàµÈ¡£ÀýÈ磬¹æÔò±í´ïʽƥÅä²Ù×÷·û£¨~£¬~*£¬µÈ£©³£Ê¹Óà eqsel£¬ÊÇ»ùÓÚÕâÑùµÄ¼ÙÉ裺ËüÃÇÖ»»áÆ¥ÅäÕû¸ö±íÖеÄһС²¿·Ö¼Ç¼¡£

Äã¿ÉÒÔ°Ñ scalarltsel ºÍ scalargtsel ÓÃÓڱȽÏÄÇЩΪ½øÐз¶Î§±È½Ï±»×ª»¯ÎªÊý×ֳ߶ȺóÓÐÃ÷ÏÔÒâÒåµÄÊý¾ÝÀàÐÍ¡£Èç¹û¿ÉÄÜ£¬°Ñ¸ÃÊý¾ÝÀàÐÍÔö¼Óµ½¿ÉÒÔ±»Îļþ src/backend/utils/adt/selfuncs.c ÀïµÄ¹ý³Ì convert_to_scalar() Àí½âµÄ²¿·Ö¡££¨×îÖÕ£¬Õâ¸ö¹ý³Ì½«±»·Åµ½ÓÉ pg_type ±íÀïµÄÒ»¸öÁбêʶµÄÿÖÖÀàÐÍÒ»¸öµÄº¯Êý´úÌ棬²»¹ýÄ¿Ç°»¹Ã»ÓÐÕâô×ö¡££©Èç¹ûÄãûÓÐ×öÕâЩ£¬ÏµÍ³ÈÔÈ»Äܹ¤×÷£¬²»¹ýÓÅ»¯Æ÷µÄ¹À¼Æ²»»áÏóÏëÏóµÄÄÇôºÃ¡£

ÔÚ src/backend/utils/adt/geo_selfuncs.c ÀﻹÓÐΪ¼¸ºÎ²Ù×÷·ûÉè¼ÆµÄ¶îÍâµÄÑ¡ÔñÐÔº¯Êý£ºareasel£¬positionsel£¬ºÍ contsel¡£ÔÚÎÒдÕâЩµÄʱºò£¬ËüÃǶ¼Ö»ÊÇ´æ¸ù£¬µ«ÊÇÄ㻹ÊÇ¿ÉÒÔʹÓ㨻òÕ߸üºÃµÄÊÇ£¬¸ÄÁ¼ËüÃÇ£©ËüÃÇ¡£

JOIN£¨ÁªºÏ£©

Èç¹ûÌṩÁË JOIN ×Ӿ䣬ÔòΪ²Ù×÷·ûÃüÃûÒ»¸öÁªºÏÑ¡ÔñÐÔº¯Êý£¨×¢ÒâÕâÀïÊǺ¯ÊýÃû£¬²»ÊDzÙ×÷·ûÃû£©¡£JOIN ×Ó¾äÖ»ÊǶԷµ»Ø²¼¶ûÁ¿µÄË«Ä¿²Ù×÷·ûÓÐÒâÒå¡£Ò»¸öÁªºÏÑ¡ÔñÐÔ¼ÆËãÆ÷ºóÃæµÄ¸ÅÄîÊDz²âÒ»¶Ô±íÉϵÄÄÇÒ»²¿·ÖÐжÔÄ¿Ç°µÄ²Ù×÷·û½«Âú×ãÏÂÃæÐÎʽµÄ WHERE ×Ó¾äµÄÌõ¼þ
                table1.field1 OP table2.field2
ºÍ RESTRICT ×Ó¾äÒ»Ñù£¬ÕâЩºÜÓпÉÄÜ°ïÖúÓÅ»¯Æ÷ÓÃ×îÉٵĴ¦Àí¹´»­³öÒª²ÉÈ¡¿ÉÄܵÄÁªºÏ˳ÐòÖеÄÄÄÒ»¸ö¡£

ºÍÇ°ÃæÒ»Ñù£¬±¾½Ú²»»áÊÔͼ½âÊÍÈçºÎÊéдһ¸öÁªºÏÑ¡ÔñÐÔ¼ÆËãÆ÷º¯Êý£¬µ«ÊǻὨÒéÄãÔÚÓÐÒ»¸ö¿ÉÓõÄÇé¿öÏ£¬Ê¹ÓÃÒ»¸ö±ê×¼µÄ¼ÆËãÆ÷£º

        eqjoinsel       for =
        neqjoinsel      for <>
        scalarltjoinsel for < or <=
        scalargtjoinsel for > or >=
        areajoinsel     for 2D area-based comparisons
        positionjoinsel for 2D position-based comparisons
        contjoinsel     for 2D containment-based comparisons

HASHES

Èç¹û³öÏÖÁË HASHES ×Ӿ䣬Ôò¸æËßϵͳ¶ÔÓÚÒ»¸ö»ùÓڴ˲Ù×÷·ûµÄÁªºÏ¿ÉÒÔʹÓùþÏ££¨É¢ÁУ©ÁªºÏ¡£HASHES Ö»¶Ô·µ»Ø²¼¶ûÁ¿µÄË«Ä¿²Ù×÷·ûÓÐÒâÒ壬²¢ÇÒʵ¼ÊÉϸòÙ×÷·û×îºÃÊǶÔijÖÖÊý¾ÝÀàÐ͵ÄÏàµÈ²Ù×÷·û¡£

¹þÏ££¨É¢ÁУ©ÁªºÏµÄ¼ÙÉèÊÇ£º¶ÔÓÚÒ»¶Ô¹þÏ££¨É¢ÁУ©µ½Í¬ÑùµÄ¹þÏ££¨É¢ÁУ©´úÂëµÄ×óºÍÓÒ²Ù×÷ÊýÖµ£¬¸ÃÁªºÏ²Ù×÷·ûÖ»ÄÜ·µ»Ø TRUE¡£Èç¹ûÁ½¸öÖµ±»·Åµ½²»Í¬µÄ¹þϣͰÀÁªºÏ½«¸ù±¾²»±È½ÏËüÃÇ£¬Òþº¬µØÒâζ×ÅÁªºÏ²Ù×÷·ûµÄ½á¹ûÒ»¶¨ÊÇ FALSE¡£ËùÒÔ¶ÔÓÚ²»´ú±íÏàµÈµÄ²Ù×÷·û£¬ÉùÃ÷ HASHES ÊÇûÓÐÒâÒåµÄ¡£

ʵ¼ÊÉÏ£¬Âß¼­ÏàµÈ»¹²»¹»ºÃ£»¸Ã²Ù×÷·û×îºÃÊÇ´ú±íÍêÈ«µÄ°´Î»ÏàµÈ£¬ÒòΪ¹þÏ£º¯Êý½«¶Ô¸ÃÖµµÄÄÚ´æ±íÏÖÐÎʽ½øÐмÆËã¶ø²»¹ÜÕâЩλµÄº¬ÒåÊÇʲô¡£ÀýÈ磬ʱ¼ä¼ä¸ôµÄÏàµÈ²»ÊÇ°´Î»ÏàµÈ£»Ê±¼ä¼ä¸ôÏàµÈ²Ù×÷·ûÈÏΪÈç¹ûÁ½¸öʱ¼ä¼ä¸ô¾ßÓÐÏàͬ³ÖÐøʱ¼äʱ¾ÍÊÇÏàµÈµÄ£¬¶ø²»¹ÜËüÃǵÄÁ½¸ö¶ËµãÊÇ·ñÏàµÈ¡£Õâ¾ÍÒâζ×ŶÔÓÚÒ»¸öÓà "=" ÔÚʱ¼ä¼ä¸ôÓòÖ®¼äµÄÁªºÏ£¬Èç¹ûÓùþÏ£ÁªºÏʵÏÖ½«»áºÍÓñðµÄÁªºÏʵÏÖÉú³É²»Í¬µÄ½á¹û£¬ÒòΪ¿ÉÒÔÆ¥ÅäµÄ´ó²¿·ÖÊý¾Ý¶Ô½«±»¹þÏ£³É²»Í¬µÄÖµÒò¶ø²»»á±»¹þÏ£ÁªºÏ½øÐбȽϡ£µ«ÊÇÈç¹ûÓÅ»¯Æ÷Ñ¡ÔñʹÓò»Í¬µÄÁªºÏ·½·¨£¬ËùÓеȺŲÙ×÷·û˵ÏàµÈµÄÊý¾Ý¶Ô¶¼»á±»ÕÒ³öÀ´¡£ÎÒÃDz»Ïë³öÏÖÄÇÖÖ²»Ò»ÖÂÐÔ£¬ËùÒÔÎÒÃÇûÓбê¼Çʱ¼ä¼ä¸ôµÈºÅΪ¿É¹þÏ£µÄ¡£

ͬʱ»¹ÓÐһЩӲ¼þÏà¹ØµÄÒòËػᵼÖÂÒ»¸ö¹þÏ£ÁªºÏµÄ¼ÆËã´íÎó¡£ÀýÈ磬Èç¹ûÄãµÄÊý¾ÝÀàÐÍÊÇÒ»¸ö½á¹¹£¬½á¹¹Àï¿ÉÄÜÓв»ÒýÈË×¢ÒâµÄÌî³ä룬Õâʱ°ÑÕâ¸öµÈºÅ²Ù×÷·û±ê¼ÇΪ HASHES Ò²ÊDz»°²È«µÄ¡££¨³ý·ÇÄãÊéдÄãµÄÆäËû²Ù×÷·ûÒÔÈ·±£ÕâЩδÓõÄλ×ÜÊÇÁã¡££©ÁíÒ»¸öÀý×ÓÊÇ FLOAT Êý¾ÝÀàÐͶԹþÏ£ÁªºÏÒ²ÊDz»°²È«µÄ¡£ÔÚ·ûºÏ IEEE ¸¡µã±ê×¼µÄ»úÆ÷ÉÏ£¬¸ºÁãºÍÕýÁãÊDz»Í¬µÄÖµ£¨²»Í¬µÄλģʽ£©£¬µ«ÊÇËüÃDZ»¶¨ÒåΪ±È½ÏÏàµÈ¡£ËùÒÔ£¬Èç¹û¸¡µãµÈºÅ±»±ê¼ÇΪ HASHES£¬Ò»¸ö¸ºÁãºÍÒ»¸öÕýÁã¿ÉÄܲ»±»¹þÏ£ÁªºÏÆ¥Å䣬µ«ÊÇÓÃÆäËûÁªºÏ´¦Àí£¬ËüÃÇÓ¦¸ÃÊÇÆ¥ÅäµÄ¡£

µ×ÏßÊÇ£ºÄã¿ÉÄÜÖ»ÄÜ°Ñ HASHES ÓÃÓÚÓ㨻ò¿ÉÄÜÓã© memcmp£¨£©ÊµÏֵĵȺŲÙ×÷·û¡£

SORT1 ºÍ SORT2

Èç¹û³öÏÖÁË SORT ×Ӿ䣬Ôò¸æËßϵͳ¶Ô»ùÓÚÄ¿Ç°µÄ²Ù×÷·û¿ÉÒÔʹÓÃÈÚºÏÁªºÏ·½·¨¡£Èç¹ûÁ½Õߣ¨×óÓÒÊý¾ÝÀàÐÍ£©¶¼ÊÇÔò¶¼ÒªÉùÃ÷¡£Ä¿Ç°µÄ²Ù×÷·û±ØÐëÊǶÔijһÊý¾ÝÀàÐͶԵÄÏàµÈ£¬²¢ÇÒ SORT1 ºÍ SORT2 ×Ó¾ä·Ö±ðΪ×ó±ßºÍÓұߵÄÊý¾ÝÀàÐÍÃüÃûÁËÅÅÐò²Ù×÷·û£¨'<' ²Ù×÷·û£©¡£

ÈÚºÏÁªºÏÊÇÒÔÕâÑùµÄ¸ÅÄîΪ»ù´¡µÄ£º¶Ô×ó±ßºÍÓұߵıí½øÐÐÅÅÐò£¬È»ºó²¢ÐеØɨÃèËüÃÇ¡£ËùÒÔ£¬Á½ÖÖÊý¾ÝÀàÐͶ¼±ØÐëÊÇÄܹ»ÍêÈ«ÅÅÐòµÄ£¬²¢ÇÒÁªºÏ²Ù×÷·û±ØÐëÖ»¶ÔÄÇЩÂäÔÚÅÅÐò˳ÐòÖеÄ"ij¸öλÖÃ"µÄÊýÖµ¶Ô³É¹¦¡£Êµ¼ÊÉÏÕâÒâζ×ÅÁªºÏ²Ù×÷·û±ØÐë±íÏÖµÃÏóµÈÓÚ¡£µ«ÊǺ͹þÏ£ÁªºÏ²»Í¬£¬£¨¹þÏ£ÁªºÏÀï×ó±ßºÍÓұߵÄÊý¾ÝÀàÐÍ×îºÃÊÇÏàͬµÄ£¨ÖÁÉÙÊÇ°´Î»ÏàµÈ£©£©£¬¿ÉÒÔ¶ÔÁ½ÖÖ²»Í¬Êý¾ÝÀàÐͽøÐÐÈÚºÏÁªºÏ -- Ö»ÒªËûÃÇÂß¼­ÏàµÈ¼´¿É¡£ÀýÈ磬 int2 ¶Ô int4 µÄÏàµÈ²Ù×÷·ûÊÇ¿ÉÒÔÓÃÈÚºÏÁªºÏµÄ¡£ÎÒÃÇÖ»ÐèÒª¿ÉÒÔ°ÑÁ½ÖÖÊý¾ÝÀàÐÍÅÅÁгÉÂß¼­¿É±ÈµÄÐòÁеÄÅÅÐò²Ù×÷·û¼´¿É¡£

µ±ÉùÃ÷ÈÚºÏÅÅÐò²Ù×÷·ûʱ£¬Ä¿Ç°µÄ²Ù×÷·ûºÍÁ½¸öÒýÓõIJÙ×÷·û±ØÐë·µ»Ø²¼¶û±äÁ¿£»SORT1 ²Ù×÷·ûµÄÁ½¸öÊäÈëÊý¾ÝÀàÐͱØÐëºÍÄ¿Ç°²Ù×÷·ûµÄ×ó²ÎÊýµÄÀàÐÍÏàͬ£¬¶ø SORT2 ²Ù×÷·ûµÄÁ½¸öÊäÈëÊý¾ÝÀàÐͱØÐëºÍÄ¿Ç°²Ù×÷·ûµÄÓÒ²ÎÊýµÄÀàÐÍÏàͬ¡££¨ºÍ COMMUTATOR ÒѾ­ NEGATOR Ò»Ñù£¬ÕâÒâζ×ŶÔÓÚÉùÃ÷¸Ã²Ù×÷·û¶øÑÔ£¬²Ù×÷·ûÃû³Æ¾Í×ã¹»ÁË£¬²¢ÇÒÈç¹ûÄãÅöÇÉÔÚÁíÒ»¸öµÈÓÚ²Ù×÷·û֮ǰ¶¨ÒåÒ»¸öµÈÓÚ²Ù×÷·û£¬ÏµÍ³Äܹ»×Ô¶¯Ìî³äÐéÄâ²Ù×÷·û¼Ç¼¡££©

ʵ¼ÊÉÏÄãÖ»ÄÜΪһ¸ö '=' ²Ù×÷·ûÊéд SORT ×Ӿ䣬²¢ÇÒÁ½¸ö²Î¿¼µÄ²Ù×÷·ûÓ¦¸Ã×ÜÊÇÃüÃûΪ '<'¡£ÊÔͼ¶ÔÃüÃûΪÆäËû¶«Î÷µÄ²Ù×÷·ûʹÓÃÈÚºÏÁªºÏ½«µ¼ÖÂÈÃÈ˾øÍûµÄ³åÍ»£¬ÎÒÃÇÒ»»á¶ù¾Í»á¿´µ½Ô­Òò¡£

»¹ÓÐһЩ¶ÔÄã±ê¼ÇΪ¿ÉÈÚºÏÁ¬½ÓµÄ²Ù×÷·ûµÄ¸½¼ÓÏÞÖÆ¡£ÕâЩÏÞÖÆĿǰûÓб» CREATE OPERATOR ¼ì²é£¬µ«ÊÇÈç¹ûÏÂÃæÖ®Ò»ÊÇÕæµÄ»°£¬ÈÚºÏÁªºÏ»áÔÚÔËÐÐʱʧ°Ü£º

    ¿ÉÈÚºÏÁªºÏµÄÏàµÈ²Ù×÷·û±ØÐëÓÐÒ»¸ö»»ÏòÆ÷£¨Èç¹ûÁ½ÖÖÊý¾ÝÀàÐÍÏàͬÔòÊÇËü×ÔÉí£¬Èç¹û²»Í¬ÔòÊÇÒ»¸öÏà¹ØµÄ²Ù×÷·û£©¡£

    ±ØÐëÓкͿÉÈÚºÏÁªºÏ²Ù×÷·û±¾ÉíÓÐÏàͬ×óÓÒÊäÈëÊý¾ÝÀàÐ굀 '<' ºÍ '>' ÅÅÐò²Ù×÷·û¡£ÕâЩ²Ù×÷·û±ØÐëÃüÃûΪ '<' ºÍ '>'£»ÔÚÕâ·½ÃæÄãûÓÐÈκÎÑ¡Ôñ£¬ÒòΪûÓÐÏÔʽÉùÃ÷ËüÃǵĹ涨¡£Òª×¢ÒâÈç¹û×óºÍÓÒÊý¾ÝÀàÐͲ»Í¬£¬ÕâЩ²Ù×÷·ûûÓÐÒ»¸öºÍ SORT ²Ù×÷·ûÖеÄÈκÎÒ»¸öÏàͬ¡£µ«ÊÇËüÃÇ×îºÃÄܶÔÓë SORT ²Ù×÷·û¼æÈݵÄÊý¾ÝÖµ½øÐÐÅÅÐò£¬·ñÔòÈÚºÏÁªºÏ½«ÔÚ¹¤×÷ÖÐʧЧ¡£

Ê