From: Alexander Nozdrin Date: April 6 2011 8:03pm Subject: bzr commit into mysql-trunk branch (alexander.nozdrin:3331) WL#5787 List-Archive: http://lists.mysql.com/commits/134868 Message-Id: <201104062003.p36K3kXY024297@acsmt357.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0343481328409757384==" --===============0343481328409757384== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/alik/MySQL/bzr/00/wl5787/mysql-trunk-wl5787/ based on revid:alexander.nozdrin@stripped 3331 Alexander Nozdrin 2011-04-07 Preliminatry patch for WL#5787 (IPv6-capable INET_ATON and INET_NTOA functions). Polishing legacy code (Item_func_inet_aton & Item_func_inet_ntoa). No real changes. modified: sql/item_inetfunc.cc === modified file 'sql/item_inetfunc.cc' --- a/sql/item_inetfunc.cc 2011-04-06 17:41:16 +0000 +++ b/sql/item_inetfunc.cc 2011-04-06 20:03:33 +0000 @@ -23,45 +23,54 @@ longlong Item_func_inet_aton::val_int() { - DBUG_ASSERT(fixed == 1); - uint byte_result = 0; - ulonglong result = 0; // We are ready for 64 bit addresses + DBUG_ASSERT(fixed); + + uint byte_result= 0; + ulonglong result= 0; const char *p,* end; - char c = '.'; // we mark c to indicate invalid IP in case length is 0 + char c= '.'; // we mark c to indicate invalid IP in case length is 0 char buff[36]; int dot_count= 0; - String *s, tmp(buff, sizeof(buff), &my_charset_latin1); - if (!(s = args[0]->val_str_ascii(&tmp))) // If null value + String tmp(buff, sizeof (buff), &my_charset_latin1); + String *s= args[0]->val_str_ascii(&tmp); + + if (!s) // If null value goto err; - null_value=0; - end= (p = s->ptr()) + s->length(); + null_value= 0; + + p= s->ptr(); + end= p + s->length(); while (p < end) { - c = *p++; - int digit = (int) (c - '0'); + c= *p++; + int digit= (int) (c - '0'); if (digit >= 0 && digit <= 9) { - if ((byte_result = byte_result * 10 + digit) > 255) - goto err; // Wrong address + byte_result= byte_result * 10 + digit; + if (byte_result > 255) + goto err; // Wrong address } else if (c == '.') { dot_count++; result= (result << 8) + (ulonglong) byte_result; - byte_result = 0; + byte_result= 0; } else - goto err; // Invalid character + goto err; // Invalid character } - if (c != '.') // IP number can't end on '.' + if (c != '.') // IP number can't end on '.' { /* - Handle short-forms addresses according to standard. Examples: - 127 -> 0.0.0.127 - 127.1 -> 127.0.0.1 - 127.2.1 -> 127.2.0.1 + Attempt to support short-form addresses (i.e. classful addresses). + The current code does not support full range of classful addresses. + Examples: + 127 -> 0.0.0.127 + 127.255 -> 127.0.0.255 + 127.256 -> NULL (should have been 127.0.1.0) + 127.2.1 -> 127.2.0.1 */ switch (dot_count) { case 1: result<<= 8; /* Fall through */ @@ -79,10 +88,9 @@ err: String* Item_func_inet_ntoa::val_str(String* str) { - DBUG_ASSERT(fixed == 1); - uchar buf[8], *p; - ulonglong n = (ulonglong) args[0]->val_int(); - char num[4]; + DBUG_ASSERT(fixed); + + ulonglong n= (ulonglong) args[0]->val_int(); /* We do not know if args[0] is NULL until we have called @@ -90,31 +98,38 @@ String* Item_func_inet_ntoa::val_str(Str Also return null if n > 255.255.255.255 */ - if ((null_value= (args[0]->null_value || n > (ulonglong) LL(4294967295)))) - return 0; // Null value + null_value= args[0]->null_value || n > (ulonglong) LL(4294967295); + + if (null_value) + return 0; // Null value str->set_charset(collation.collation); str->length(0); - int4store(buf,n); + + uchar buf[8]; + int4store(buf, n); /* Now we can assume little endian. */ - num[3]='.'; - for (p=buf+4 ; p-- > buf ; ) + char num[4]; + num[3]= '.'; + + for (uchar *p= buf + 4; p-- > buf;) { - uint c = *p; - uint n1,n2; // Try to avoid divisions - n1= c / 100; // 100 digits - c-= n1*100; - n2= c / 10; // 10 digits - c-=n2*10; // last digit - num[0]=(char) n1+'0'; - num[1]=(char) n2+'0'; - num[2]=(char) c+'0'; + uint c= *p; + uint n1, n2; // Try to avoid divisions + n1= c / 100; // 100 digits + c -= n1 * 100; + n2= c / 10; // 10 digits + c -= n2 * 10; // last digit + num[0]= (char) n1 + '0'; + num[1]= (char) n2 + '0'; + num[2]= (char) c + '0'; uint length= (n1 ? 4 : n2 ? 3 : 2); // Remove pre-zero uint dot_length= (p <= buf) ? 1 : 0; - (void) str->append(num + 4 - length, length - dot_length, - &my_charset_latin1); + + str->append(num + 4 - length, length - dot_length, &my_charset_latin1); } + return str; } --===============0343481328409757384== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/alexander.nozdrin@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: alexander.nozdrin@stripped\ # 96ecwskvyzk8y2pp # target_branch: file:///home/alik/MySQL/bzr/00/wl5787/mysql-trunk-\ # wl5787/ # testament_sha1: a2e2b570a6a6f9192d84b8ba5cab6dc65198bf48 # timestamp: 2011-04-07 00:03:37 +0400 # base_revision_id: alexander.nozdrin@stripped\ # iatofhow4tm9109r # # Begin bundle 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 --===============0343481328409757384==--