diff --git a/libmariadb/my_stmt_codec.c b/libmariadb/my_stmt_codec.c
index 7d90151..9d0cdc5 100644
--- a/libmariadb/my_stmt_codec.c
+++ b/libmariadb/my_stmt_codec.c
@@ -918,16 +918,17 @@ static
 void ps_fetch_bin(MYSQL_BIND *r_param, const MYSQL_FIELD *field,
              unsigned char **row)
 {
-  ulong field_length= net_field_length(row);
+  ulong field_length= net_field_length(row), offset= MIN(r_param->offset, field_length);
   size_t copylen;
 
   /* Bug conc-155: For text columns we need to store terminating zero character */
   if (!(field->flags & BINARY_FLAG) && r_param->buffer_type == MYSQL_TYPE_STRING)
     field_length++;
 
-  copylen= MIN(field_length, r_param->buffer_length);
-  memcpy(r_param->buffer, *row, copylen);
-  *r_param->error= copylen < field_length;
+  /* Making sure that we do not copy past the field. e.g. if offset >= field_length, copylen is 0 */
+  copylen= MIN(field_length - offset, r_param->buffer_length);
+  memcpy(r_param->buffer, *row + offset, copylen);
+  *r_param->error= copylen < field_length - offset;
 
   /* don't count trailing zero if we fetch into string */
   if (r_param->buffer_type == MYSQL_TYPE_STRING &&
@@ -936,7 +937,8 @@ void ps_fetch_bin(MYSQL_BIND *r_param, const MYSQL_FIELD *field,
 
   *r_param->length= field_length;
 
-  (*row) += field_length;
+  /* In fact the caller preserves and restores the current value, so doesn't really matter what do we write here */
+  (*row) += copylen/*field_length*/;
 }
 /* }}} */
 
diff --git a/unittest/libmariadb/fetch.c b/unittest/libmariadb/fetch.c
index 664712c..c7af736 100644
--- a/unittest/libmariadb/fetch.c
+++ b/unittest/libmariadb/fetch.c
@@ -268,19 +268,19 @@ static int test_fetch_seek(MYSQL *mysql)
 static int test_fetch_offset(MYSQL *mysql)
 {
   MYSQL_STMT *stmt;
-  MYSQL_BIND my_bind[1];
-  char       data[11];
-  ulong      length;
+  MYSQL_BIND my_bind[2];
+  char       data[11], chunk[5];
+  ulong      length[2];
   int        rc;
-  my_bool    is_null;
+  my_bool    is_null[2];
   char       *query = "SELECT * FROM t1";
 
 
   rc= mysql_query(mysql, "drop table if exists t1");
   check_mysql_rc(rc, mysql);
-  rc= mysql_query(mysql, "create table t1(a char(10))");
+  rc= mysql_query(mysql, "create table t1(a char(10), b mediumblob)");
   check_mysql_rc(rc, mysql);
-  rc= mysql_query(mysql, "insert into t1 values('abcdefghij'), (null)");
+  rc= mysql_query(mysql, "insert into t1 values('abcdefghij', 'klmnopqrstzy'), (null, null)");
   check_mysql_rc(rc, mysql);
 
   stmt= mysql_stmt_init(mysql);
@@ -293,8 +293,14 @@ static int test_fetch_offset(MYSQL *mysql)
   my_bind[0].buffer_type= MYSQL_TYPE_STRING;
   my_bind[0].buffer= (void *)data;
   my_bind[0].buffer_length= 11;
-  my_bind[0].is_null= &is_null;
-  my_bind[0].length= &length;
+  my_bind[0].is_null= &is_null[0];
+  my_bind[0].length= &length[0];
+
+  my_bind[1].buffer_type= MYSQL_TYPE_MEDIUM_BLOB;
+  my_bind[1].buffer= NULL;
+  my_bind[1].buffer_length= 0;
+  my_bind[1].is_null= &is_null[1];
+  my_bind[1].length= &length[1];
 
   rc= mysql_stmt_execute(stmt);
   check_stmt_rc(rc,stmt);
@@ -312,32 +318,60 @@ static int test_fetch_offset(MYSQL *mysql)
   check_stmt_rc(rc,stmt);
 
   rc= mysql_stmt_fetch(stmt);
-  check_stmt_rc(rc,stmt);
+  FAIL_UNLESS(rc == MYSQL_DATA_TRUNCATED, "rc != MYSQL_DATA_TRUNCATED");
 
   data[0]= '\0';
-  rc= mysql_stmt_fetch_column(stmt, my_bind, 0, 0);
+  rc= mysql_stmt_fetch_column(stmt, &my_bind[0], 0, 0);
+  check_stmt_rc(rc,stmt);
+
+
+  FAIL_IF(!(strncmp(data, "abcdefghij", 11) == 0 && length[0] == 10), "Wrong value");
+  FAIL_IF(my_bind[0].error_value, "No truncation, but error is set");
+
+  rc= mysql_stmt_fetch_column(stmt, &my_bind[0], 0, 5);
   check_stmt_rc(rc,stmt);
+  FAIL_IF(!(strncmp(data, "fghij", 6) == 0 && length[0] == 10), "Wrong value");
+  FAIL_IF(my_bind[0].error_value, "No truncation, but error is set");
 
+  rc= mysql_stmt_fetch_column(stmt, &my_bind[0], 0, 9);
+  check_stmt_rc(rc,stmt);
+  FAIL_IF(!(strncmp(data, "j", 2) == 0 && length[0] == 10), "Wrong value");
+  FAIL_IF(my_bind[0].error_value, "No truncation, but error is set");
+
+  /* Now blob field */
+  my_bind[1].buffer= chunk;
+  my_bind[1].buffer_length= sizeof(chunk);
+
+  rc= mysql_stmt_fetch_column(stmt, &my_bind[1], 1, 0);
+  check_stmt_rc(rc,stmt);
 
-  FAIL_IF(!(strncmp(data, "abcd", 4) == 0 && length == 10), "Wrong value");
+  FAIL_IF(!(strncmp(chunk, "klmno", 5) == 0 && length[1] == 12), "Wrong value");
+  FAIL_IF(my_bind[1].error_value == '\0', "Truncation, but error is not set");
 
-  rc= mysql_stmt_fetch_column(stmt, my_bind, 0, 5);
+  rc= mysql_stmt_fetch_column(stmt, &my_bind[1], 1, 5);
   check_stmt_rc(rc,stmt);
-  FAIL_IF(!(strncmp(data, "fg", 2) == 0 && length == 10), "Wrong value");
+  FAIL_IF(!(strncmp(chunk, "pqrst", 5) == 0 && length[1] == 12), "Wrong value");
+  FAIL_IF(my_bind[1].error_value == '\0', "Truncation, but error is not set");
 
-  rc= mysql_stmt_fetch_column(stmt, my_bind, 0, 9);
+  rc= mysql_stmt_fetch_column(stmt, &my_bind[1], 1, 10);
   check_stmt_rc(rc,stmt);
-  FAIL_IF(!(strncmp(data, "j", 1) == 0 && length == 10), "Wrong value");
+  FAIL_IF(!(strncmp(chunk, "zy", 2) == 0 && length[1] == 12), "Wrong value");
+  FAIL_IF(my_bind[1].error_value, "No truncation, but error is set");
 
   rc= mysql_stmt_fetch(stmt);
   check_stmt_rc(rc,stmt);
 
-  is_null= 0;
+  memset(is_null, 0, sizeof(is_null));
 
-  rc= mysql_stmt_fetch_column(stmt, my_bind, 0, 0);
+  rc= mysql_stmt_fetch_column(stmt, &my_bind[0], 0, 0);
+  check_stmt_rc(rc,stmt);
+
+  FAIL_IF(is_null[0] != 1, "Null flag not set");
+
+  rc= mysql_stmt_fetch_column(stmt, &my_bind[1], 1, 0);
   check_stmt_rc(rc,stmt);
 
-  FAIL_IF(is_null != 1, "Null flag not set");
+  FAIL_IF(is_null[1] != 1, "Null flag not set");
 
   rc= mysql_stmt_fetch(stmt);
   FAIL_IF(rc != MYSQL_NO_DATA, "Expected MYSQL_NO_DATA");
