|
91 | 91 | || [ map { "col$_" } 1..$numFields ];
|
92 | 92 | $sth->{TYPE} = $attribs->{TYPE}
|
93 | 93 | || [ (DBI::SQL_VARCHAR()) x $numFields ];
|
94 |
| - $sth->{PRECISION} = $attribs->{PRECISION} |
95 |
| - || _max_columnar_lengths($numFields, $rows); |
96 | 94 | $sth->{SCALE} = $attribs->{SCALE}
|
97 | 95 | || [ (0) x $numFields ];
|
98 | 96 | $sth->{NULLABLE} = $attribs->{NULLABLE}
|
99 | 97 | || [ (2) x $numFields ];
|
| 98 | + if ($attribs->{PRECISION}) { |
| 99 | + $sth->{PRECISION} = $attribs->{PRECISION}; |
| 100 | + } # else FETCH will dynamically compute |
100 | 101 | }
|
101 | 102 |
|
102 | 103 | $outer;
|
|
153 | 154 | return \@args;
|
154 | 155 | }
|
155 | 156 |
|
156 |
| - sub _max_columnar_lengths { |
157 |
| - my ($numFields, $rows) = @_; |
158 |
| - my @precision = (0,) x $numFields; |
159 |
| - my $len; |
160 |
| - for my $row (@$rows) { |
161 |
| - for my $i (0 .. $numFields - 1) { |
162 |
| - next unless defined $len = length($row->[$i]); |
163 |
| - $precision[$i] = $len if $len > $precision[$i]; |
164 |
| - } |
165 |
| - } |
166 |
| - return wantarray ? @precision : \@precision; |
167 |
| - } |
168 | 157 | }
|
169 | 158 |
|
170 | 159 |
|
|
212 | 201 | sub FETCH {
|
213 | 202 | my ($sth, $attrib) = @_;
|
214 | 203 | # would normally validate and only fetch known attributes
|
| 204 | + if ($attrib eq 'PRECISION') { |
| 205 | + # prepare() did _not_ specify PRECISION. We'll only get here once. |
| 206 | + return $sth->{PRECISION} = _max_col_lengths(@{$sth}{'NUM_OF_FIELDS', 'rows'}); |
| 207 | + } |
215 | 208 | # else pass up to DBI to handle
|
216 | 209 | return $sth->SUPER::FETCH($attrib);
|
217 | 210 | }
|
|
222 | 215 | # else pass up to DBI to handle
|
223 | 216 | return $sth->SUPER::STORE($attrib, $value);
|
224 | 217 | }
|
| 218 | + |
| 219 | + sub _max_col_lengths { |
| 220 | + my ($numFields, $rows) = @_; |
| 221 | + my @precision = (0,) x $numFields; |
| 222 | + my $len; |
| 223 | + for my $row (@$rows) { |
| 224 | + for my $i (0 .. $numFields - 1) { |
| 225 | + next unless defined($len = length($row->[$i])); |
| 226 | + $precision[$i] = $len if $len > $precision[$i]; |
| 227 | + } |
| 228 | + } |
| 229 | + return wantarray ? @precision : \@precision; |
| 230 | + } |
225 | 231 | }
|
226 | 232 |
|
227 | 233 | 1;
|
|
0 commit comments