1
0
mirror of https://github.com/MariaDB/server.git synced 2025-05-05 16:59:35 +03:00
mariadb/mysql-test/suite/sys_vars/t/div_precision_increment_basic.test
Monty 34eb10e406 MDEV-10138 Support for decimals up to 38 digits
Decimals with float, double and decimal now works the following way:

- DECIMAL_NOT_SPECIFIED is used when declaring DECIMALS without a firm number
  of decimals.  It's only used in asserts and my_decimal_int_part.
- FLOATING_POINT_DECIMALS (31) is used to mark that a FLOAT or DOUBLE
  was defined without decimals. This is regarded as a floating point value.
- Max decimals allowed for FLOAT and DOUBLE is FLOATING_POINT_DECIMALS-1
- Clients assumes that float and double with decimals >= NOT_FIXED_DEC are
  floating point values (no decimals)
- In the .frm decimals=FLOATING_POINT_DECIMALS are used to define
  floating point for float and double (31, like before)

To ensure compatibility with old clients we do:

- When storing float and double, we change NOT_FIXED_DEC to
  FLOATING_POINT_DECIMALS.
- When creating fields from .frm we change for float and double
  FLOATING_POINT_DEC to NOT_FIXED_DEC
- When sending definition for a float/decimal field without decimals
  to the client as part of a result set we convert NOT_FIXED_DEC to
  FLOATING_POINT_DECIMALS.
- variance() and std() has changed to limit the decimals to
  FLOATING_POINT_DECIMALS -1 to not get the double converted floating point.
  (This was to preserve compatiblity)
- FLOAT and DOUBLE still have 30 as max number of decimals.

Bugs fixed:

variance() printed more decimals than we support for double values.

New behaviour:
- Strings now have 38 decimals instead of 30 when converted to decimal
- CREATE ... SELECT with a decimal with > 30 decimals will create a column
  with a smaller range than before as we are trying to preserve the number of
  decimals.


Other changes
- We are now using the obsolete bit FIELDFLAG_LEFT_FULLSCREEN to specify
  decimals > 31
- NOT_FIXED_DEC is now declared in one place
- For clients, NOT_FIXED_DEC is always 31 (to ensure compatibility).
  On the server NOT_FIXED_DEC is DECIMAL_NOT_SPECIFIED (39)
- AUTO_SEC_PART_DIGITS is taken from DECIMAL_NOT_SPECIFIED
- DOUBLE conversion functions are now using DECIMAL_NOT_SPECIFIED instead of
  NOT_FIXED_DEC
2016-06-22 22:04:55 +03:00

209 lines
9.5 KiB
Plaintext

############## mysql-test\t\div_precision_increment_basic.test #################
# #
# Variable Name: div_precision_increment #
# Scope: GLOBAL & SESSION #
# Access Type: Dynamic #
# Data Type: Numeric #
# Default Value: 4 #
# Range: 0 - 30 #
# #
# #
# Creation Date: 2008-02-07 #
# Author: Salman Rawala #
# #
# Description: Test Cases of Dynamic System Variable "div_precision_increment" #
# that checks behavior of this variable in the following ways #
# * Default Value #
# * Valid & Invalid values #
# * Scope & Access method #
# * Data Integrity . #
# #
# Reference: http://dev.mysql.com/doc/refman/5.1/en/ #
# server-system-variables.html#option_mysqld_div_precision_increment #
# #
################################################################################
--source include/load_sysvars.inc
#######################################################################
# START OF div_precision_increment TESTS #
#######################################################################
#############################################################
# Save initial value #
#############################################################
SET @start_global_value = @@global.div_precision_increment;
SELECT @start_global_value;
SET @start_session_value = @@session.div_precision_increment;
SELECT @start_session_value;
--echo '#--------------------FN_DYNVARS_027_01-------------------------#'
#######################################################################
# Display the DEFAULT value of div_precision_increment #
#######################################################################
SET @@global.div_precision_increment = 100;
SET @@global.div_precision_increment = DEFAULT;
SELECT @@global.div_precision_increment;
SET @@session.div_precision_increment = 200;
SET @@session.div_precision_increment = DEFAULT;
SELECT @@session.div_precision_increment;
--echo '#--------------------FN_DYNVARS_027_02-------------------------#'
#######################################################################
# Check the DEFAULT value of div_precision_increment #
#######################################################################
SET @@global.div_precision_increment = @start_global_value;
SELECT @@global.div_precision_increment = 4;
SET @@session.div_precision_increment = @start_session_value;
SELECT @@session.div_precision_increment = 4;
--echo '#--------------------FN_DYNVARS_027_03-------------------------#'
#################################################################################
# Change the value of div_precision_increment to a valid value for GLOBAL Scope #
#################################################################################
SET @@global.div_precision_increment = 1;
SELECT @@global.div_precision_increment;
SET @@global.div_precision_increment = 0;
SELECT @@global.div_precision_increment;
SET @@global.div_precision_increment = 10;
SELECT @@global.div_precision_increment;
SET @@global.div_precision_increment = 30;
SELECT @@global.div_precision_increment;
--echo '#--------------------FN_DYNVARS_027_04-------------------------#'
##################################################################################
# Change the value of div_precision_increment to a valid value for SESSION Scope #
##################################################################################
SET @@session.div_precision_increment = 1;
SELECT @@session.div_precision_increment;
SET @@session.div_precision_increment = 0;
SELECT @@session.div_precision_increment;
SET @@session.div_precision_increment = 7;
SELECT @@session.div_precision_increment;
SET @@session.div_precision_increment = 30;
SELECT @@session.div_precision_increment;
--echo '#------------------FN_DYNVARS_027_05-----------------------#'
###################################################################
# Change the value of div_precision_increment to an invalid value #
###################################################################
SET @@global.div_precision_increment = 39;
SELECT @@global.div_precision_increment;
SET @@global.div_precision_increment = 50;
SELECT @@global.div_precision_increment;
SET @@global.div_precision_increment = -1024;
SELECT @@global.div_precision_increment;
SET @@global.div_precision_increment = 65536;
SELECT @@global.div_precision_increment;
SET @@session.div_precision_increment = 50;
SELECT @@session.div_precision_increment;
SET @@session.div_precision_increment = 37;
SELECT @@session.div_precision_increment;
SET @@session.div_precision_increment = -2;
SELECT @@session.div_precision_increment;
SET @@session.div_precision_increment = 65550;
SELECT @@session.div_precision_increment;
--Error ER_WRONG_TYPE_FOR_VAR
SET @@global.div_precision_increment = 65530.30;
SELECT @@global.div_precision_increment;
--Error ER_WRONG_TYPE_FOR_VAR
SET @@global.div_precision_increment = OFF;
SELECT @@global.div_precision_increment;
--Error ER_WRONG_TYPE_FOR_VAR
SET @@session.div_precision_increment = ON;
SELECT @@session.div_precision_increment;
--Error ER_WRONG_TYPE_FOR_VAR
SET @@session.div_precision_increment = 65530.30;
SELECT @@session.div_precision_increment;
--echo '#------------------FN_DYNVARS_027_06-----------------------#'
####################################################################
# Check if the value in GLOBAL Table matches value in variable #
####################################################################
SELECT @@global.div_precision_increment = VARIABLE_VALUE
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
WHERE VARIABLE_NAME='div_precision_increment';
--echo '#------------------FN_DYNVARS_027_07-----------------------#'
####################################################################
# Check if the value in SESSION Table matches value in variable #
####################################################################
SELECT @@session.div_precision_increment = VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='div_precision_increment';
# FN_DYNVARS_027_07 - Check if TRUE and FALSE values can be used on variable
SET @@global.div_precision_increment = TRUE;
SELECT @@global.div_precision_increment;
SET @@global.div_precision_increment = FALSE;
SELECT @@global.div_precision_increment;
--echo '#---------------------FN_DYNVARS_027_08----------------------#'
####################################################################################
# Check if accessing variable with and without GLOBAL point to same variable #
####################################################################################
SET @@global.div_precision_increment = 0;
SELECT @@div_precision_increment = @@global.div_precision_increment;
--echo '#---------------------FN_DYNVARS_027_09----------------------#'
########################################################################################################
# Check if accessing variable with SESSION,LOCAL and without SCOPE points to same session variable #
########################################################################################################
SET @@div_precision_increment = 1;
SELECT @@div_precision_increment = @@local.div_precision_increment;
SELECT @@local.div_precision_increment = @@session.div_precision_increment;
--echo '#---------------------FN_DYNVARS_027_10----------------------#'
##################################################################################
# Check if div_precision_increment can be accessed with and without @@ sign #
##################################################################################
SET div_precision_increment = 1;
SELECT @@div_precision_increment;
--Error ER_PARSE_ERROR
SET local.div_precision_increment = 1;
--Error ER_UNKNOWN_TABLE
SELECT local.div_precision_increment;
--Error ER_PARSE_ERROR
SET session.div_precision_increment = 1;
--Error ER_UNKNOWN_TABLE
SELECT session.div_precision_increment;
--Error ER_BAD_FIELD_ERROR
SELECT div_precision_increment = @@session.div_precision_increment;
####################################
# Restore initial value #
####################################
SET @@global.div_precision_increment = @start_global_value;
SELECT @@global.div_precision_increment;
SET @@session.div_precision_increment = @start_session_value;
SELECT @@session.div_precision_increment;
#######################################################
# END OF div_precision_increment TESTS #
#######################################################