Someething to consider for after the 7.4 release, perhaps... As per today's CVS version, PQunescapeBytea() does the following when it encounters an escaped character (i.e., a backslash) in the escaped string strtext at offset i:
["if (strtext[i] == '\\')"] i++; if (strtext[i] == '\\') buffer[j++] = strtext[i++]; else { if ((isdigit(strtext[i])) && (isdigit(strtext[i + 1])) && (isdigit(strtext[i + 2]))) { byte = VAL(strtext[i++]); byte = (byte << 3) + VAL(strtext[i++]); buffer[j++] = (byte << 3) + VAL(strtext[i++]); } } This code completely ignores any other usage of the backslash in the escaped string, generating no output for unknown escape sequences. Is that the desired behaviour? The code would be a little simpler if it were to allow al characters to be escaped, which means ignoring the backslash but not the following character: i++; if (isdigit(strtext[i]) && isdigit(strtext[i+1]) && isdigit(strtext[i+2])) { byte = VAL(strtext[i]); i++; byte = (byte<<3) + VAL(strtext[i]); i++; byte = (byte<<3) + VAL(strtext[i]); buffer[j++] = byte; } else { buffer[j++] = strtext[i++]; } In fact, the "else" part is identical to the normal (non-escaped) part of the loop, so it could probably be merged--leaving only the octal parsing part as a special case. Then the whole loop could become something like this: [unsigned char c;] for (i=j=buflen=0; i<(int)strtextlen; ++i, buffer[j++]=c) { c = strtext[i]; if (c == '\\') { c = strtext[i++]; /* Skip backslash */ if (isdigit(c) && isdigit(strtext[i+1]) && isdigit(strtext[i+2])) { /* Parse octal number */ byte = VAL(strtext[i++]); byte = (byte << 3) + VAL(strtext[i++]); c = (byte << 3) + VAL(strtext[i]); } } } ...Which saves 8 lines, reduces the number of special cases, adds some comments, and permits arbitrary characters to be escaped. Jeroen ---------------------------(end of broadcast)--------------------------- TIP 2: you can get off all lists at once with the unregister command (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])