~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/function/str/pad.cc

  • Committer: Olaf van der Spek
  • Date: 2011-06-22 17:45:22 UTC
  • mto: This revision was merged to the branch mainline in revision 2347.
  • Revision ID: olafvdspek@gmail.com-20110622174522-81mj1izig7kj2ujp
Refactor

Show diffs side-by-side

added added

removed removed

Lines of Context:
66
66
String *Item_func_rpad::val_str(String *str)
67
67
{
68
68
  assert(fixed == 1);
 
69
  null_value=1;
69
70
  uint32_t res_byte_length,res_char_length,pad_char_length,pad_byte_length;
70
 
  char *to;
71
71
  const char *ptr_pad;
72
72
  /* must be int64_t to avoid truncation */
73
73
  int64_t count= args[1]->val_int();
74
 
  int64_t byte_count;
75
74
  String *res= args[0]->val_str(str);
76
75
  String *rpad= args[2]->val_str(&rpad_str);
77
76
 
78
 
  if (!res || args[1]->null_value || !rpad ||
79
 
      ((count < 0) && !args[1]->unsigned_flag))
80
 
    goto err;
81
 
  null_value=0;
 
77
  if (!res || args[1]->null_value || !rpad || ((count < 0) && !args[1]->unsigned_flag))
 
78
    return 0;
82
79
  /* Assumes that the maximum length of a String is < INT32_MAX. */
83
80
  /* Set here so that rest of code sees out-of-bound value as such. */
84
81
  if ((uint64_t) count > INT32_MAX)
86
83
  if (count <= (res_char_length= res->numchars()))
87
84
  {                                             // String to pad is big enough
88
85
    res->length(res->charpos((int) count));     // Shorten result if longer
89
 
    return (res);
 
86
    null_value=0;
 
87
    return res;
90
88
  }
91
89
  pad_char_length= rpad->numchars();
92
90
 
93
 
  byte_count= count * collation.collation->mbmaxlen;
 
91
  int64_t byte_count= count * collation.collation->mbmaxlen;
94
92
  if ((uint64_t) byte_count > session.variables.max_allowed_packet)
95
93
  {
96
94
    push_warning_printf(&session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
97
95
                        ER_WARN_ALLOWED_PACKET_OVERFLOWED,
98
96
                        ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED),
99
97
                        func_name(), session.variables.max_allowed_packet);
100
 
    goto err;
 
98
    return 0;
101
99
  }
102
100
  if (args[2]->null_value || !pad_char_length)
103
 
    goto err;
 
101
    return 0;
104
102
  res_byte_length= res->length();       /* Must be done before alloc_buffer */
105
 
  if (!(res= alloc_buffer(res,str,&tmp_value, (ulong) byte_count)))
106
 
    goto err;
107
 
 
108
 
  to= (char*) res->ptr()+res_byte_length;
 
103
  res= alloc_buffer(res,str,&tmp_value, (ulong) byte_count);
 
104
  char* to= (char*) res->ptr()+res_byte_length;
109
105
  ptr_pad=rpad->ptr();
110
106
  pad_byte_length= rpad->length();
111
107
  count-= res_char_length;
121
117
    to+= pad_byte_length;
122
118
  }
123
119
  res->length(to- (char*) res->ptr());
124
 
  return (res);
125
 
 
126
 
 err:
127
 
  null_value=1;
128
 
  return 0;
 
120
  null_value=0;
 
121
  return res;
129
122
}
130
123
 
131
124
 
207
200
 
208
201
  if (args[2]->null_value || !pad_char_length)
209
202
    goto err;
210
 
  str->alloc((uint32_t) byte_count);
 
203
  str->alloc((size_t) byte_count);
211
204
  str->length(0);
212
205
  str->set_charset(collation.collation);
213
206
  count-= res_char_length;