Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
516b8f0a
Commit
516b8f0a
authored
May 24, 2006
by
evgen@moonbone.local
Browse files
Options
Browse Files
Download
Plain Diff
Manually merged
parents
13ae6420
4a673444
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
113 additions
and
8 deletions
+113
-8
mysql-test/r/view.result
mysql-test/r/view.result
+42
-0
mysql-test/t/view.test
mysql-test/t/view.test
+29
-0
sql/field.cc
sql/field.cc
+1
-1
sql/field.h
sql/field.h
+6
-0
sql/sql_select.cc
sql/sql_select.cc
+35
-7
No files found.
mysql-test/r/view.result
View file @
516b8f0a
...
@@ -2694,3 +2694,45 @@ Age
...
@@ -2694,3 +2694,45 @@ Age
38
38
DROP VIEW v1;
DROP VIEW v1;
DROP TABLE t1;
DROP TABLE t1;
CREATE TABLE t1 (id int NOT NULL PRIMARY KEY, a char(6) DEFAULT 'xxx');
INSERT INTO t1(id) VALUES (1), (2), (3), (4);
INSERT INTO t1 VALUES (5,'yyy'), (6,'yyy');
SELECT * FROM t1;
id a
1 xxx
2 xxx
3 xxx
4 xxx
5 yyy
6 yyy
CREATE VIEW v1(a, m) AS SELECT a, MIN(id) FROM t1 GROUP BY a;
SELECT * FROM v1;
a m
xxx 1
yyy 5
CREATE TABLE t2 SELECT * FROM v1;
INSERT INTO t2(m) VALUES (0);
SELECT * FROM t2;
a m
xxx 1
yyy 5
xxx 0
DROP VIEW v1;
DROP TABLE t1,t2;
CREATE TABLE t1 (id int PRIMARY KEY, e ENUM('a','b') NOT NULL DEFAULT 'b');
INSERT INTO t1(id) VALUES (1), (2), (3);
INSERT INTO t1 VALUES (4,'a');
SELECT * FROM t1;
id e
1 b
2 b
3 b
4 a
CREATE VIEW v1(m, e) AS SELECT MIN(id), e FROM t1 GROUP BY e;
CREATE TABLE t2 SELECT * FROM v1;
SELECT * FROM t2;
m e
4 a
1 b
DROP VIEW v1;
DROP TABLE IF EXISTS t1,t2;
mysql-test/t/view.test
View file @
516b8f0a
...
@@ -2571,4 +2571,33 @@ SELECT * FROM v1;
...
@@ -2571,4 +2571,33 @@ SELECT * FROM v1;
DROP
VIEW
v1
;
DROP
VIEW
v1
;
DROP
TABLE
t1
;
DROP
TABLE
t1
;
#
# Bug #19089: wrong inherited dafault values in temp table views
#
CREATE
TABLE
t1
(
id
int
NOT
NULL
PRIMARY
KEY
,
a
char
(
6
)
DEFAULT
'xxx'
);
INSERT
INTO
t1
(
id
)
VALUES
(
1
),
(
2
),
(
3
),
(
4
);
INSERT
INTO
t1
VALUES
(
5
,
'yyy'
),
(
6
,
'yyy'
);
SELECT
*
FROM
t1
;
CREATE
VIEW
v1
(
a
,
m
)
AS
SELECT
a
,
MIN
(
id
)
FROM
t1
GROUP
BY
a
;
SELECT
*
FROM
v1
;
CREATE
TABLE
t2
SELECT
*
FROM
v1
;
INSERT
INTO
t2
(
m
)
VALUES
(
0
);
SELECT
*
FROM
t2
;
DROP
VIEW
v1
;
DROP
TABLE
t1
,
t2
;
CREATE
TABLE
t1
(
id
int
PRIMARY
KEY
,
e
ENUM
(
'a'
,
'b'
)
NOT
NULL
DEFAULT
'b'
);
INSERT
INTO
t1
(
id
)
VALUES
(
1
),
(
2
),
(
3
);
INSERT
INTO
t1
VALUES
(
4
,
'a'
);
SELECT
*
FROM
t1
;
CREATE
VIEW
v1
(
m
,
e
)
AS
SELECT
MIN
(
id
),
e
FROM
t1
GROUP
BY
e
;
CREATE
TABLE
t2
SELECT
*
FROM
v1
;
SELECT
*
FROM
t2
;
DROP
VIEW
v1
;
DROP
TABLE
IF
EXISTS
t1
,
t2
;
sql/field.cc
View file @
516b8f0a
...
@@ -1223,7 +1223,7 @@ Field::Field(char *ptr_arg,uint32 length_arg,uchar *null_ptr_arg,
...
@@ -1223,7 +1223,7 @@ Field::Field(char *ptr_arg,uint32 length_arg,uchar *null_ptr_arg,
field_name
(
field_name_arg
),
field_name
(
field_name_arg
),
query_id
(
0
),
key_start
(
0
),
part_of_key
(
0
),
part_of_sortkey
(
0
),
query_id
(
0
),
key_start
(
0
),
part_of_key
(
0
),
part_of_sortkey
(
0
),
unireg_check
(
unireg_check_arg
),
unireg_check
(
unireg_check_arg
),
field_length
(
length_arg
),
null_bit
(
null_bit_arg
)
field_length
(
length_arg
),
null_bit
(
null_bit_arg
),
dflt_field
(
0
)
{
{
flags
=
null_ptr
?
0
:
NOT_NULL_FLAG
;
flags
=
null_ptr
?
0
:
NOT_NULL_FLAG
;
comment
.
str
=
(
char
*
)
""
;
comment
.
str
=
(
char
*
)
""
;
...
...
sql/field.h
View file @
516b8f0a
...
@@ -54,6 +54,12 @@ class Field
...
@@ -54,6 +54,12 @@ class Field
char
*
ptr
;
// Position to field in record
char
*
ptr
;
// Position to field in record
uchar
*
null_ptr
;
// Byte where null_bit is
uchar
*
null_ptr
;
// Byte where null_bit is
/*
dflt_field is used only for the fields of temporary tables.
It points to the default value of the field in another table
from which this field has been created.
*/
Field
*
dflt_field
;
// Field to copy default value from
/*
/*
Note that you can use table->in_use as replacement for current_thd member
Note that you can use table->in_use as replacement for current_thd member
only inside of val_*() and store() members (e.g. you can't use it in cons)
only inside of val_*() and store() members (e.g. you can't use it in cons)
...
...
sql/sql_select.cc
View file @
516b8f0a
...
@@ -8197,6 +8197,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
...
@@ -8197,6 +8197,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
bool
make_copy_field
,
bool
make_copy_field
,
uint
convert_blob_length
)
uint
convert_blob_length
)
{
{
Field
*
result
;
Item
::
Type
orig_type
=
type
;
Item
::
Type
orig_type
=
type
;
Item
*
orig_item
=
0
;
Item
*
orig_item
=
0
;
...
@@ -8214,8 +8215,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
...
@@ -8214,8 +8215,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
case
Item
:
:
SUM_FUNC_ITEM
:
case
Item
:
:
SUM_FUNC_ITEM
:
{
{
Item_sum
*
item_sum
=
(
Item_sum
*
)
item
;
Item_sum
*
item_sum
=
(
Item_sum
*
)
item
;
Field *result= item_sum->create_tmp_field(group, table,
result
=
item_sum
->
create_tmp_field
(
group
,
table
,
convert_blob_length
);
convert_blob_length);
if
(
!
result
)
if
(
!
result
)
thd
->
fatal_error
();
thd
->
fatal_error
();
return
result
;
return
result
;
...
@@ -8225,7 +8225,6 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
...
@@ -8225,7 +8225,6 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
{
{
Item_field
*
field
=
(
Item_field
*
)
item
;
Item_field
*
field
=
(
Item_field
*
)
item
;
bool
orig_modify
=
modify_item
;
bool
orig_modify
=
modify_item
;
Field *result;
if
(
orig_type
==
Item
::
REF_ITEM
)
if
(
orig_type
==
Item
::
REF_ITEM
)
modify_item
=
0
;
modify_item
=
0
;
/*
/*
...
@@ -8259,6 +8258,8 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
...
@@ -8259,6 +8258,8 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
convert_blob_length
);
convert_blob_length
);
if
(
orig_type
==
Item
::
REF_ITEM
&&
orig_modify
)
if
(
orig_type
==
Item
::
REF_ITEM
&&
orig_modify
)
((
Item_ref
*
)
orig_item
)
->
set_result_field
(
result
);
((
Item_ref
*
)
orig_item
)
->
set_result_field
(
result
);
if
(
field
->
field
->
eq_def
(
result
))
result
->
dflt_field
=
field
->
field
;
return
result
;
return
result
;
}
}
/* Fall through */
/* Fall through */
...
@@ -8281,9 +8282,9 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
...
@@ -8281,9 +8282,9 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
DBUG_ASSERT
(((
Item_result_field
*
)
item
)
->
result_field
);
DBUG_ASSERT
(((
Item_result_field
*
)
item
)
->
result_field
);
*
from_field
=
((
Item_result_field
*
)
item
)
->
result_field
;
*
from_field
=
((
Item_result_field
*
)
item
)
->
result_field
;
}
}
return create_tmp_field_from_item(thd, item, table,
(make_copy_field ? 0 :
return
create_tmp_field_from_item
(
thd
,
item
,
table
,
copy_func), modify_item
,
(
make_copy_field
?
0
:
copy_func
)
,
convert_blob_length);
modify_item
,
convert_blob_length
);
case
Item
:
:
TYPE_HOLDER
:
case
Item
:
:
TYPE_HOLDER
:
return
((
Item_type_holder
*
)
item
)
->
make_field_by_type
(
table
);
return
((
Item_type_holder
*
)
item
)
->
make_field_by_type
(
table
);
default:
// Dosen't have to be stored
default:
// Dosen't have to be stored
...
@@ -8739,6 +8740,33 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
...
@@ -8739,6 +8740,33 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
null_count
+=
(
field
->
field_length
&
7
);
null_count
+=
(
field
->
field_length
&
7
);
}
}
field
->
reset
();
field
->
reset
();
if
(
field
->
dflt_field
&&
field
->
dflt_field
->
ptr
)
{
/*
field->dflt_field is set only in the cases when 'field' can
inherit the default value that is defined for the field referred
by the Item_field object from which 'field' has been created.
For a field created not from a Item_field item dflt_field == 0.
*/
my_ptrdiff_t
diff
;
Field
*
orig_field
=
field
->
dflt_field
;
/* Get the value from default_values */
diff
=
(
my_ptrdiff_t
)
(
orig_field
->
table
->
s
->
default_values
-
orig_field
->
table
->
record
[
0
]);
orig_field
->
move_field
(
diff
);
// Points now at default_values
bool
is_null
=
orig_field
->
is_real_null
();
char
*
from
=
orig_field
->
ptr
;
orig_field
->
move_field
(
-
diff
);
// Back to record[0]
if
(
is_null
)
field
->
set_null
();
else
{
field
->
set_notnull
();
memcpy
(
field
->
ptr
,
from
,
field
->
pack_length
());
}
}
if
(
from_field
[
i
])
if
(
from_field
[
i
])
{
/* Not a table Item */
{
/* Not a table Item */
copy
->
set
(
field
,
from_field
[
i
],
save_sum_fields
);
copy
->
set
(
field
,
from_field
[
i
],
save_sum_fields
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment