That's because HASH partitioning calculates the partition number as MOD(_expression_, _number_) where _number_ is the number of partitions.
Consider the following:
mysql> SELECT NOW(), DAY(NOW()), MOD(DAY(NOW()), 150);
+---------------------+------------+----------------------+
| NOW() | DAY(NOW()) | MOD(DAY(NOW()), 150) |
+---------------------+------------+----------------------+
| 2007-06-14 23:44:58 | 14 | 14 |
+---------------------+------------+----------------------+
1 row in set (0.00 sec)
Where Y > X, MOD(X, Y) will never be greater than X. So the greatest partition number, where X is the value returned by DAY(), will never be greater than 31, because DAY() never returns a value greater than 31.
Try LINEAR HASH, KEY, or LINEAR KEY, and see what happens.
Jon Stephens
MySQL Documentation Team @ Oracle
MySQL Dev Zone
MySQL Server Documentation
Oracle