Commit b2264ff8 authored by anozdrin/alik@station.'s avatar anozdrin/alik@station.
Browse files

Patch for BUG#30736: Row Size Too Large Error Creating a Table and

Inserting Data.

The problem was that under some circumstances Field class was not
properly initialized before calling create_length_to_internal_length()
function, which led to assert failure.

The fix is to do the proper initialization.

The user-visible problem was that under some circumstances
CREATE TABLE ... SELECT statement crashed the server or led
to wrong error message (wrong results).
parent 6fa35a5d
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -4096,4 +4096,39 @@ SELECT `x` FROM v3;
x
1
DROP VIEW v1, v2, v3;

#
# Bug#30736: Row Size Too Large Error Creating a Table and
# Inserting Data.
#
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;

CREATE TABLE t1(
c1 DECIMAL(10, 2),
c2 FLOAT);

INSERT INTO t1 VALUES (0, 1), (2, 3), (4, 5);

CREATE TABLE t2(
c3 DECIMAL(10, 2))
SELECT
c1 * c2 AS c3
FROM t1;

SELECT * FROM t1;
c1	c2
0.00	1
2.00	3
4.00	5

SELECT * FROM t2;
c3
0.00
6.00
20.00

DROP TABLE t1;
DROP TABLE t2;

End of 5.0 tests
+48 −0
Original line number Diff line number Diff line
@@ -3484,4 +3484,52 @@ DROP VIEW v1, v2, v3;

--enable_ps_protocol

###########################################################################

--echo
--echo #
--echo # Bug#30736: Row Size Too Large Error Creating a Table and
--echo # Inserting Data.
--echo #

--disable_warnings
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
--enable_warnings

--echo

CREATE TABLE t1(
  c1 DECIMAL(10, 2),
  c2 FLOAT);

--echo

INSERT INTO t1 VALUES (0, 1), (2, 3), (4, 5);

--echo

CREATE TABLE t2(
  c3 DECIMAL(10, 2))
  SELECT
    c1 * c2 AS c3
  FROM t1;

--echo

SELECT * FROM t1;

--echo

SELECT * FROM t2;

--echo

DROP TABLE t1;
DROP TABLE t2;

--echo

###########################################################################

--echo End of 5.0 tests
+1 −1
Original line number Diff line number Diff line
@@ -955,8 +955,8 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
	  sql_field->length=		dup_field->char_length;
          sql_field->pack_length=	dup_field->pack_length;
          sql_field->key_length=	dup_field->key_length;
	  sql_field->create_length_to_internal_length();
	  sql_field->decimals=		dup_field->decimals;
	  sql_field->create_length_to_internal_length();
	  sql_field->unireg_check=	dup_field->unireg_check;
          /* 
            We're making one field from two, the result field will have