1212// See the License for the specific language governing permissions and
1313// limitations under the License.
1414
15- use sqlparser:: ast:: { AlterColumnOperation , AlterTableOperation , ObjectName } ;
15+ use sqlparser:: ast:: { AlterColumnOperation , AlterTableOperation , ColumnOption , ObjectName } ;
1616
1717use std:: borrow:: Cow ;
1818use std:: sync:: Arc ;
@@ -27,7 +27,8 @@ use crate::planner::operator::alter_table::change_column::{
2727} ;
2828use crate :: planner:: operator:: alter_table:: drop_column:: DropColumnOperator ;
2929use crate :: planner:: operator:: Operator ;
30- use crate :: planner:: { Childrens , LogicalPlan } ;
30+ use crate :: planner:: Childrens ;
31+ use crate :: planner:: LogicalPlan ;
3132use crate :: storage:: Transaction ;
3233use crate :: types:: value:: DataValue ;
3334use crate :: types:: LogicalType ;
@@ -50,6 +51,33 @@ impl<T: Transaction, A: AsRef<[(&'static str, DataValue)]>> Binder<'_, '_, T, A>
5051 Ok ( expr)
5152 }
5253
54+ fn bind_change_column_options (
55+ & mut self ,
56+ options : & [ ColumnOption ] ,
57+ data_type : & LogicalType ,
58+ ) -> Result < ( DefaultChange , NotNullChange ) , DatabaseError > {
59+ let mut default_change = DefaultChange :: NoChange ;
60+ let mut not_null_change = NotNullChange :: NoChange ;
61+
62+ for option in options {
63+ match option {
64+ ColumnOption :: Null => not_null_change = NotNullChange :: Drop ,
65+ ColumnOption :: NotNull => not_null_change = NotNullChange :: Set ,
66+ ColumnOption :: Default ( expr) => {
67+ default_change =
68+ DefaultChange :: Set ( self . bind_alter_default_expr ( expr, data_type) ?) ;
69+ }
70+ option => {
71+ return Err ( DatabaseError :: UnsupportedStmt ( format ! (
72+ "CHANGE/MODIFY COLUMN does not currently support this option: {option:?}"
73+ ) ) )
74+ }
75+ }
76+ }
77+
78+ Ok ( ( default_change, not_null_change) )
79+ }
80+
5381 pub ( crate ) fn bind_alter_table (
5482 & mut self ,
5583 name : & ObjectName ,
@@ -200,24 +228,27 @@ impl<T: Transaction, A: AsRef<[(&'static str, DataValue)]>> Binder<'_, '_, T, A>
200228 options,
201229 column_position,
202230 } => {
203- if !options . is_empty ( ) || column_position. is_some ( ) {
231+ if column_position. is_some ( ) {
204232 return Err ( DatabaseError :: UnsupportedStmt (
205- "MODIFY COLUMN currently only supports changing the data type " . to_string ( ) ,
233+ "MODIFY COLUMN does not currently support column positions " . to_string ( ) ,
206234 ) ) ;
207235 }
208236 let old_column_name = col_name. value . to_lowercase ( ) ;
209237 let _ = table
210238 . get_column_by_name ( & old_column_name)
211239 . ok_or_else ( || DatabaseError :: column_not_found ( old_column_name. clone ( ) ) ) ?;
240+ let data_type = LogicalType :: try_from ( data_type. clone ( ) ) ?;
241+ let ( default_change, not_null_change) =
242+ self . bind_change_column_options ( options, & data_type) ?;
212243
213244 LogicalPlan :: new (
214245 Operator :: ChangeColumn ( ChangeColumnOperator {
215246 table_name,
216247 new_column_name : old_column_name. clone ( ) ,
217248 old_column_name,
218- data_type : LogicalType :: try_from ( data_type . clone ( ) ) ? ,
219- default_change : DefaultChange :: NoChange ,
220- not_null_change : NotNullChange :: NoChange ,
249+ data_type,
250+ default_change,
251+ not_null_change,
221252 } ) ,
222253 Childrens :: None ,
223254 )
@@ -229,10 +260,9 @@ impl<T: Transaction, A: AsRef<[(&'static str, DataValue)]>> Binder<'_, '_, T, A>
229260 options,
230261 column_position,
231262 } => {
232- if !options . is_empty ( ) || column_position. is_some ( ) {
263+ if column_position. is_some ( ) {
233264 return Err ( DatabaseError :: UnsupportedStmt (
234- "CHANGE COLUMN currently only supports renaming and changing the data type"
235- . to_string ( ) ,
265+ "CHANGE COLUMN does not currently support column positions" . to_string ( ) ,
236266 ) ) ;
237267 }
238268 let old_column_name = old_name. value . to_lowercase ( ) ;
@@ -246,15 +276,18 @@ impl<T: Transaction, A: AsRef<[(&'static str, DataValue)]>> Binder<'_, '_, T, A>
246276 "illegal column naming" . to_string ( ) ,
247277 ) ) ;
248278 }
279+ let data_type = LogicalType :: try_from ( data_type. clone ( ) ) ?;
280+ let ( default_change, not_null_change) =
281+ self . bind_change_column_options ( options, & data_type) ?;
249282
250283 LogicalPlan :: new (
251284 Operator :: ChangeColumn ( ChangeColumnOperator {
252285 table_name,
253286 old_column_name,
254287 new_column_name,
255- data_type : LogicalType :: try_from ( data_type . clone ( ) ) ? ,
256- default_change : DefaultChange :: NoChange ,
257- not_null_change : NotNullChange :: NoChange ,
288+ data_type,
289+ default_change,
290+ not_null_change,
258291 } ) ,
259292 Childrens :: None ,
260293 )
0 commit comments