Commit 9eaf718a authored by unknown's avatar unknown

New support for ignoring blobs during scans. We now seek past them if we...

New support for ignoring blobs during scans. We now seek past them if we determine that they are of no use to us. This is a big save in tables with blobs. Far less memory overhead and the seek is quite a bit faster. 


mysql-test/r/archive.result:
  New results
mysql-test/t/archive.test:
  More tests for indexes and new tests for being selective on selects.
sql/ha_archive.cc:
  We now look and see if blobs are needed, and if they are not, we seek past them.
parent 14ff02d3
...@@ -12433,31 +12433,108 @@ a b ...@@ -12433,31 +12433,108 @@ a b
DROP TABLE t5; DROP TABLE t5;
CREATE TABLE `t5` ( CREATE TABLE `t5` (
`a` int(11) NOT NULL auto_increment, `a` int(11) NOT NULL auto_increment,
b char(12), b blob(12),
KEY (`a`) KEY (`a`)
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1; ) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;
INSERT INTO t5 VALUES (NULL, "foo"); INSERT INTO t5 VALUES (NULL, "foo");
INSERT INTO t5 VALUES (NULL, "foo"); INSERT INTO t5 VALUES (NULL, "We the people");
INSERT INTO t5 VALUES (NULL, "foo"); INSERT INTO t5 VALUES (NULL, "in order to form a more pefect union");
INSERT INTO t5 VALUES (NULL, "foo"); INSERT INTO t5 VALUES (NULL, "establish justice");
INSERT INTO t5 VALUES (NULL, "foo"); INSERT INTO t5 VALUES (NULL, "foo grok ");
INSERT INTO t5 VALUES (32, "foo"); INSERT INTO t5 VALUES (32, "ensure domestic tranquility");
INSERT INTO t5 VALUES (23, "foo"); INSERT INTO t5 VALUES (23, "provide for the common defense");
INSERT INTO t5 VALUES (NULL, "foo"); INSERT INTO t5 VALUES (NULL, "fo fooo");
INSERT INTO t5 VALUES (NULL, "foo"); INSERT INTO t5 VALUES (NULL, "foo just naother bit of text");
INSERT INTO t5 VALUES (3, "foo"); INSERT INTO t5 VALUES (3, "foo this is mine to think about");
INSERT INTO t5 VALUES (NULL, "foo"); INSERT INTO t5 VALUES (NULL, "promote the general welfare");
SELECT * FROM t5; SELECT * FROM t5;
a b a b
1 foo 1 foo
2 foo 2 We the people
3 foo 3 in order to form a more pefect union
4 foo 4 establish justice
5 foo 5 foo grok
32 foo 32 ensure domestic tranquility
23 foo 23 provide for the common defense
33 foo 33 fo fooo
34 foo 34 foo just naother bit of text
3 foo 3 foo this is mine to think about
35 foo 35 promote the general welfare
SELECT b FROM t5;
b
foo
We the people
in order to form a more pefect union
establish justice
foo grok
ensure domestic tranquility
provide for the common defense
fo fooo
foo just naother bit of text
foo this is mine to think about
promote the general welfare
SELECT b FROM t5 WHERE a =3;
b
in order to form a more pefect union
foo this is mine to think about
SELECT b FROM t5 WHERE a IN (32, 23, 5);
b
foo grok
ensure domestic tranquility
provide for the common defense
DROP TABLE t5;
CREATE TABLE `t5` (
`a` int(11) NOT NULL auto_increment,
b blob(12),
c blob(12),
KEY (`a`)
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;
INSERT INTO t5 VALUES (NULL, "foo", "grok this!");
INSERT INTO t5 VALUES (NULL, "We the people", NULL);
INSERT INTO t5 VALUES (NULL, "in order to form a more peefect union", "secure the blessing of liberty");
INSERT INTO t5 VALUES (NULL, "establish justice", "to ourselves and");
INSERT INTO t5 VALUES (32, "ensure domestic tranquility", NULL);
INSERT INTO t5 VALUES (23, "provide for the common defense", "posterity");
INSERT INTO t5 VALUES (NULL, "promote the general welfare", "do ordain");
SELECT * FROM t5;
a b c
1 foo grok this!
2 We the people NULL
3 in order to form a more peefect union secure the blessing of liberty
4 establish justice to ourselves and
32 ensure domestic tranquility NULL
23 provide for the common defense posterity
33 promote the general welfare do ordain
SELECT b FROM t5;
b
foo
We the people
in order to form a more peefect union
establish justice
ensure domestic tranquility
provide for the common defense
promote the general welfare
SELECT b FROM t5 WHERE a =3;
b
in order to form a more peefect union
SELECT b FROM t5 WHERE a IN (32, 23, 5);
b
ensure domestic tranquility
provide for the common defense
SELECT c FROM t5;
c
grok this!
NULL
secure the blessing of liberty
to ourselves and
NULL
posterity
do ordain
SELECT c FROM t5 WHERE a =3;
c
secure the blessing of liberty
SELECT c FROM t5 WHERE a IN (32, 23, 5);
c
NULL
posterity
drop table t1, t2, t4, t5; drop table t1, t2, t4, t5;
...@@ -1409,22 +1409,52 @@ DROP TABLE t5; ...@@ -1409,22 +1409,52 @@ DROP TABLE t5;
CREATE TABLE `t5` ( CREATE TABLE `t5` (
`a` int(11) NOT NULL auto_increment, `a` int(11) NOT NULL auto_increment,
b char(12), b blob(12),
KEY (`a`) KEY (`a`)
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1; ) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;
INSERT INTO t5 VALUES (NULL, "foo"); INSERT INTO t5 VALUES (NULL, "foo");
INSERT INTO t5 VALUES (NULL, "foo"); INSERT INTO t5 VALUES (NULL, "We the people");
INSERT INTO t5 VALUES (NULL, "foo"); INSERT INTO t5 VALUES (NULL, "in order to form a more pefect union");
INSERT INTO t5 VALUES (NULL, "foo"); INSERT INTO t5 VALUES (NULL, "establish justice");
INSERT INTO t5 VALUES (NULL, "foo"); INSERT INTO t5 VALUES (NULL, "foo grok ");
INSERT INTO t5 VALUES (32, "foo"); INSERT INTO t5 VALUES (32, "ensure domestic tranquility");
INSERT INTO t5 VALUES (23, "foo"); INSERT INTO t5 VALUES (23, "provide for the common defense");
INSERT INTO t5 VALUES (NULL, "foo"); INSERT INTO t5 VALUES (NULL, "fo fooo");
INSERT INTO t5 VALUES (NULL, "foo"); INSERT INTO t5 VALUES (NULL, "foo just naother bit of text");
INSERT INTO t5 VALUES (3, "foo"); INSERT INTO t5 VALUES (3, "foo this is mine to think about");
INSERT INTO t5 VALUES (NULL, "foo"); INSERT INTO t5 VALUES (NULL, "promote the general welfare");
SELECT * FROM t5;
SELECT b FROM t5;
SELECT b FROM t5 WHERE a =3;
SELECT b FROM t5 WHERE a IN (32, 23, 5);
#More blob tests
DROP TABLE t5;
CREATE TABLE `t5` (
`a` int(11) NOT NULL auto_increment,
b blob(12),
c blob(12),
KEY (`a`)
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;
INSERT INTO t5 VALUES (NULL, "foo", "grok this!");
INSERT INTO t5 VALUES (NULL, "We the people", NULL);
INSERT INTO t5 VALUES (NULL, "in order to form a more peefect union", "secure the blessing of liberty");
INSERT INTO t5 VALUES (NULL, "establish justice", "to ourselves and");
INSERT INTO t5 VALUES (32, "ensure domestic tranquility", NULL);
INSERT INTO t5 VALUES (23, "provide for the common defense", "posterity");
INSERT INTO t5 VALUES (NULL, "promote the general welfare", "do ordain");
SELECT * FROM t5; SELECT * FROM t5;
SELECT b FROM t5;
SELECT b FROM t5 WHERE a =3;
SELECT b FROM t5 WHERE a IN (32, 23, 5);
SELECT c FROM t5;
SELECT c FROM t5 WHERE a =3;
SELECT c FROM t5 WHERE a IN (32, 23, 5);
# #
# Cleanup, test is over # Cleanup, test is over
......
...@@ -170,6 +170,7 @@ handlerton archive_hton = { ...@@ -170,6 +170,7 @@ handlerton archive_hton = {
NULL, /* Start Consistent Snapshot */ NULL, /* Start Consistent Snapshot */
NULL, /* Flush logs */ NULL, /* Flush logs */
NULL, /* Show status */ NULL, /* Show status */
NULL, /* Alter interface */
HTON_NO_FLAGS HTON_NO_FLAGS
}; };
...@@ -973,7 +974,10 @@ int ha_archive::get_row(azio_stream *file_to_read, byte *buf) ...@@ -973,7 +974,10 @@ int ha_archive::get_row(azio_stream *file_to_read, byte *buf)
for (ptr= table->s->blob_field, end=ptr + table->s->blob_fields ; for (ptr= table->s->blob_field, end=ptr + table->s->blob_fields ;
ptr != end ; ptr != end ;
ptr++) ptr++)
total_blob_length += ((Field_blob*) table->field[*ptr])->get_length(); {
if (ha_get_bit_in_read_set(((Field_blob*) table->field[*ptr])->fieldnr))
total_blob_length += ((Field_blob*) table->field[*ptr])->get_length();
}
/* Adjust our row buffer if we need be */ /* Adjust our row buffer if we need be */
buffer.alloc(total_blob_length); buffer.alloc(total_blob_length);
...@@ -987,11 +991,18 @@ int ha_archive::get_row(azio_stream *file_to_read, byte *buf) ...@@ -987,11 +991,18 @@ int ha_archive::get_row(azio_stream *file_to_read, byte *buf)
size_t size= ((Field_blob*) table->field[*ptr])->get_length(); size_t size= ((Field_blob*) table->field[*ptr])->get_length();
if (size) if (size)
{ {
read= azread(file_to_read, last, size); if (ha_get_bit_in_read_set(((Field_blob*) table->field[*ptr])->fieldnr))
if ((size_t) read != size) {
DBUG_RETURN(HA_ERR_END_OF_FILE); read= azread(file_to_read, last, size);
((Field_blob*) table->field[*ptr])->set_ptr(size, last); if ((size_t) read != size)
last += size; DBUG_RETURN(HA_ERR_END_OF_FILE);
((Field_blob*) table->field[*ptr])->set_ptr(size, last);
last += size;
}
else
{
(void)azseek(file_to_read, size, SEEK_CUR);
}
} }
} }
DBUG_RETURN(0); DBUG_RETURN(0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment