1. 12 Feb, 2007 2 commits
    • malff/marcsql@weblab.(none)'s avatar
      Merge weblab.(none):/home/marcsql/TREE/mysql-5.0-24532 · 2ece3604
      malff/marcsql@weblab.(none) authored
      into  weblab.(none):/home/marcsql/TREE/mysql-5.1-24532-merge
      2ece3604
    • malff/marcsql@weblab.(none)'s avatar
      Bug#24532 (The return data type of IS TRUE is different from similar · 4e556b23
      malff/marcsql@weblab.(none) authored
        operations)
      
      Before this change, the boolean predicates:
      - X IS TRUE,
      - X IS NOT TRUE,
      - X IS FALSE,
      - X IS NOT FALSE
      were implemented by expanding the Item tree in the parser, by using a
      construct like:
      Item_func_if(Item_func_ifnull(X, <value>), <value>, <value>)
      
      Each <value> was a constant integer, either 0 or 1.
      
      A bug in the implementation of the function IF(a, b, c), in
      Item_func_if::fix_length_and_dec(), would cause the following :
      
      When the arguments b and c are both unsigned, the result type of the
      function was signed, instead of unsigned.
      
      When the result of the if function is signed, space for the sign could be
      counted twice (in the max() expression for a signed argument, and in the
      total), causing the member max_length to be too high.
      
      An effect of this is that the final type of IF(x, int(1), int(1)) would be
      int(2) instead of int(1).
      
      With this fix, the problems found in Item_func_if::fix_length_and_dec()
      have been fixed.
      
      While it's semantically correct to represent 'X IS TRUE' with
      Item_func_if(Item_func_ifnull(X, <value>), <value>, <value>),
      there are however more problems with this construct.
      
      a)
      Building the parse tree involves :
      - creating 5 Item instances (3 ints, 1 ifnull, 1 if),
      - creating each Item calls my_pthread_getspecific_ptr() once in the operator
        new(size), and a second time in the Item::Item() constructor, resulting
        in a total of 10 calls to get the current thread.
      Evaluating the expression involves evaluating up to 4 nodes at runtime.
      This representation could be greatly simplified and improved.
      
      b)
      Transforming the parse tree internally with if(ifnull(...)) is fine as long
      as this transformation is internal to the server implementation.
      With views however, the result of the parse tree is later exposed by the
      ::print() functions, and stored as part of the view definition.
      Doing this has long term consequences:
      
      1)
      The original semantic 'X IS TRUE' is lost, and replaced by the
      if(ifnull(...)) expression. As a result, SHOW CREATE VIEW does not restore
      the original code.
      
      2)
      Should a future version of MySQL implement the SQL BOOLEAN data type for
      example, views created today using 'X IS NULL' can be exported using
      mysqldump, and imported again. Such views would be converted correctly and
      automatically to use a BOOLEAN column in the future version.
      With 'X IS TRUE' and the current implementations, views using these
      "boolean" predicates would not be converted during the export/import, and
      would use integer columns instead.
      The difference traces back to how SHOW CREATE VIEW preserves 'X IS NULL' but
      does not preserve the 'X IS TRUE' semantic.
      
      With this fix, internal representation of 'X IS TRUE' booleans predicates
      has changed, so that:
      - dedicated Item classes are created for each predicate,
      - only 1 Item is created to represent 1 predicate
      - my_pthread_getspecific_ptr() is invoked 1 time instead of 10
      - SHOW CREATE VIEW preserves the original semantic, and prints 'X IS TRUE'.
      
      Note that, because of the fix in Item_func_if, views created before this fix
      will:
      - correctly use a int(1) type instead of int(2) for boolean predicates,
      - incorrectly print the if(ifnull(...), ...) expression in SHOW CREATE VIEW,
      since the original semantic (X IS TRUE) has been lost.
      - except for the syntax used in SHOW CREATE VIEW, these views will operate
      properly, no action is needed.
      
      Views created after this fix will operate correctly, and will preserve the
      original code semantic in SHOW CREATE VIEW.
      4e556b23
  2. 08 Feb, 2007 1 commit
  3. 06 Feb, 2007 2 commits
    • malff/marcsql@weblab.(none)'s avatar
      Merge weblab.(none):/home/marcsql/TREE/mysql-5.0-12976_b · 6cde77e1
      malff/marcsql@weblab.(none) authored
      into  weblab.(none):/home/marcsql/TREE/mysql-5.1-12976-merge
      6cde77e1
    • malff/marcsql@weblab.(none)'s avatar
      Bug#12976 (stored procedures local variables of type bit) · b5f8b636
      malff/marcsql@weblab.(none) authored
      Before this change, a local variables in stored procedures / stored functions
      or triggers, when declared with a type of bit(N), would not evaluate their
      value properly.
      
      The problem was that the data was incorrectly typed as a string,
      causing for example bit b'1', implemented as a byte 0x01, to be interpreted
      as a string starting with the character 0x01. This later would cause
      implicit conversions to integers or booleans to fail.
      
      The root cause of this problem was an incorrect translation between field
      types, like bit(N), and internal types used when representing values in Item
      objects.
      
      Also, before this change, the function HEX() would sometime print extra "0"
      characters when invoked with bit(N) values.
      
      With this fix, the type translation (sp_map_result_type, sp_map_item_type)
      has been changed so that bit(N) fields are represented with integer values.
      
      A consequence is that, for the function HEX(), when called with a stored
      procedure local variable of type bit(N) as argument, HEX() is provided with an
      integer instead of a string, and therefore does not print "0" padding.
      
      A test case for Bug 12976 was present in the test suite, and has been updated.
      b5f8b636
  4. 05 Feb, 2007 1 commit
  5. 04 Feb, 2007 1 commit
  6. 03 Feb, 2007 1 commit
  7. 02 Feb, 2007 2 commits
  8. 01 Feb, 2007 2 commits
  9. 31 Jan, 2007 1 commit
  10. 30 Jan, 2007 4 commits
  11. 29 Jan, 2007 3 commits
  12. 25 Jan, 2007 16 commits
  13. 24 Jan, 2007 4 commits
    • svoj@april.(none)'s avatar
      Merge mysql.com:/home/svoj/devel/mysql/merge/mysql-5.0-engines · f05c519a
      svoj@april.(none) authored
      into  mysql.com:/home/svoj/devel/mysql/merge/mysql-5.1-engines
      f05c519a
    • svoj@april.(none)'s avatar
      Merge mysql.com:/home/svoj/devel/bk/mysql-5.1 · 3efc2965
      svoj@april.(none) authored
      into  mysql.com:/home/svoj/devel/mysql/merge/mysql-5.1-engines
      3efc2965
    • malff/marcsql@weblab.(none)'s avatar
      Merge malff@bk-internal.mysql.com:/home/bk/mysql-5.1-runtime · a97b3d37
      malff/marcsql@weblab.(none) authored
      into  weblab.(none):/home/marcsql/TREE/mysql-5.1-21029
      a97b3d37
    • malff/marcsql@weblab.(none)'s avatar
      Bug#21029 (Dependencies between sql_yacc.cc and dependent headers not detected) · 3ae384d0
      malff/marcsql@weblab.(none) authored
      The build scripts in general, using automake, autoconf, etc, contain several
      special commands and work around all related to the way the bison code in the
      parser is built, for sql/sql_yacc.yy. These work arounds, accumulated over
      time during development, ultimately cause the build scripts to be unstable
      and cause build defects by not enforcing dependencies.
      
      This fix simplifies the build process and aligns it with the automake tooling,
      which provides native support for bison and *.yy files.
      
      In particular, the following problem have been fixed:
      - dependencies with sql_yacc.cc were not honored (Bug 21029), leading to
        corrupted builds,
      - the work around introduced by Bug 24557, to cleanup the generated files
        sql_yacc.h and sql_yacc.cc, has been removed,
      - the generated makefile, in a source distribution, used to destroy the files
        sql_yacc.h and sql_yacc.cc on a 'make clean' target. This has been fixed:
        these files are now removed by make maintainer-clean.
      - The root cause of the problem found with gcc 4.1 (see Bug 24619) has been
        clearly documented, and the "sed" hack has been replaced by a cleaner
        work around, when building the code with bison 1.875.
      - Removed the file sql/sql_yacc.yy.bak, added by WL 3031 by accident.
      - Removed the unnecessary AM_YFLAG= --debug introduced by WL 3432, since
        the compiling option DBUG_OFF takes precedence when setting YYDEBUG.
      3ae384d0