Automatic type conversion
От | Thomas G. Lockhart |
---|---|
Тема | Automatic type conversion |
Дата | |
Msg-id | 3554F153.2B09C37B@alumni.caltech.edu обсуждение исходный текст |
Ответы |
Re: [HACKERS] Automatic type conversion
|
Список | pgsql-hackers |
I've committed changes to allow more automatic type conversion. Lots of files were touched, mostly in backend/parser/. The new code tries to do the right thing for conversions, and does handle cases which were problematic before: -- there isn't a floating point factorial operator... tgl=> select (4.3 !); ?column? -------- 24 (1 row) -- there isn't an integer exponentiation operator... tgl=> select 2 ^ 3; ?column? -------- 8 (1 row) -- concatenation on unspecified types didn't used to work... tgl=> select '123' || '456'; ?column? -------- 123456 (1 row) -- didn't used to correctly truncate strings into tables... tgl=> create table cc (c char(4)); CREATE tgl=> insert into cc select '123' || '456'; INSERT 268073 1 tgl=> select * from cc; c ---- 1234 (1 row) So, it should fix longstanding issues. However, the main goal should be that it doesn't do the WRONG thing at any time. So, test away and post any problems or issues that come up; we have lots of time to fix things before v6.4. One change in behavior is that I defined (for builtin types) the concept of a "preferred type" in each category/class of types (e.g. float8 is the preferred type for numerics, datetime is the preferred type for date/times, etc.). And, unspecified types are preferentially resolved to use this preferred type. So, the following behavior has changed: -- this is now done as a float8 calculation, used to be float4... tgl=> select '123.456'::float4 * '1.99999999999'; ?column? ---------------- 246.912002562242 (1 row) Before, unknown types, such as the second string above, were resolved to be the same type as the other type, if available. So the calculation would have been truncated at ~7 decimal places. The good thing about this is that the behavior of the above is now the same as if the second string was specified without the quotes: tgl=> select '123.456'::float4 * 1.99999999999; ?column? ---------------- 246.912002562242 (1 row) where before it was evaluated differently in the two cases. Anyway, try things out, and I'll be writing this up for the docs. Will post the topics on hackers along the way... I haven't yet changed the regression tests to reflect the new behavior, just in case it needs to be different. Also, all regression tests pass with the only differences as mentioned above. btw, the code still has lots of cleanup needed, moving subroutines around and taking out defunct code. But will do that later. Have fun. - Tom
В списке pgsql-hackers по дате отправления: