summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <mskold@mysql.com>2006-06-21 09:36:50 +0200
committerunknown <mskold@mysql.com>2006-06-21 09:36:50 +0200
commitaedbb330c8243867cbb95c6cf31096811ba5d8f3 (patch)
tree0d04d914a5045446ce185cfc302111c974d1c7c0 /sql
parent3f19b05bb00366df88d72f9b6507f897f2f9370b (diff)
downloadmariadb-git-aedbb330c8243867cbb95c6cf31096811ba5d8f3.tar.gz
Fix for Bug #19906 REPLACE doesn't update TEXT fields correctly
Diffstat (limited to 'sql')
-rw-r--r--sql/ha_ndbcluster.cc10
-rw-r--r--sql/ha_ndbcluster.h3
2 files changed, 10 insertions, 3 deletions
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index e2d82d9f559..e57a060f59b 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -771,10 +771,11 @@ int g_get_ndb_blobs_value(NdbBlob *ndb_blob, void *arg)
if (ndb_blob->blobsNextBlob() != NULL)
DBUG_RETURN(0);
ha_ndbcluster *ha= (ha_ndbcluster *)arg;
- DBUG_RETURN(ha->get_ndb_blobs_value(ndb_blob));
+ DBUG_RETURN(ha->get_ndb_blobs_value(ndb_blob, ha->m_blobs_offset));
}
-int ha_ndbcluster::get_ndb_blobs_value(NdbBlob *last_ndb_blob)
+int ha_ndbcluster::get_ndb_blobs_value(NdbBlob *last_ndb_blob,
+ my_ptrdiff_t ptrdiff)
{
DBUG_ENTER("get_ndb_blobs_value");
@@ -807,7 +808,10 @@ int ha_ndbcluster::get_ndb_blobs_value(NdbBlob *last_ndb_blob)
if (ndb_blob->readData(buf, len) != 0)
DBUG_RETURN(-1);
DBUG_ASSERT(len == blob_len);
+ // Ugly hack assumes only ptr needs to be changed
+ field_blob->ptr+= ptrdiff;
field_blob->set_ptr(len, buf);
+ field_blob->ptr-= ptrdiff;
}
offset+= blob_size;
}
@@ -870,6 +874,7 @@ int ha_ndbcluster::get_ndb_value(NdbOperation *ndb_op, Field *field,
if (ndb_blob != NULL)
{
// Set callback
+ m_blobs_offset= buf - (byte*) table->record[0];
void *arg= (void *)this;
DBUG_RETURN(ndb_blob->setActiveHook(g_get_ndb_blobs_value, arg) != 0);
}
@@ -4552,6 +4557,7 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg):
m_ops_pending(0),
m_skip_auto_increment(TRUE),
m_blobs_pending(0),
+ m_blobs_offset(0),
m_blobs_buffer(0),
m_blobs_buffer_size(0),
m_dupkey((uint) -1),
diff --git a/sql/ha_ndbcluster.h b/sql/ha_ndbcluster.h
index e417996a5d9..01950c2b00f 100644
--- a/sql/ha_ndbcluster.h
+++ b/sql/ha_ndbcluster.h
@@ -629,7 +629,7 @@ private:
int set_ndb_value(NdbOperation*, Field *field, uint fieldnr, bool *set_blob_value= 0);
int get_ndb_value(NdbOperation*, Field *field, uint fieldnr, byte*);
friend int g_get_ndb_blobs_value(NdbBlob *ndb_blob, void *arg);
- int get_ndb_blobs_value(NdbBlob *last_ndb_blob);
+ int get_ndb_blobs_value(NdbBlob *last_ndb_blob, my_ptrdiff_t ptrdiff);
int set_primary_key(NdbOperation *op, const byte *key);
int set_primary_key_from_record(NdbOperation *op, const byte *record);
int set_index_key_from_record(NdbOperation *op, const byte *record,
@@ -706,6 +706,7 @@ private:
ha_rows m_ops_pending;
bool m_skip_auto_increment;
bool m_blobs_pending;
+ my_ptrdiff_t m_blobs_offset;
// memory for blobs in one tuple
char *m_blobs_buffer;
uint32 m_blobs_buffer_size;