@@ -1872,7 +1872,9 @@ fn parse_show_objects() {
18721872fn parse_show_create_view ( ) {
18731873 assert_eq ! (
18741874 verified_stmt( "SHOW CREATE VIEW foo" ) ,
1875- Statement :: ShowCreateView { view_name: ObjectName ( vec![ "foo" . into( ) ] ) }
1875+ Statement :: ShowCreateView {
1876+ view_name: ObjectName ( vec![ "foo" . into( ) ] )
1877+ }
18761878 )
18771879}
18781880
@@ -2711,6 +2713,103 @@ fn parse_create_sink() {
27112713 }
27122714}
27132715
2716+ #[ test]
2717+ fn parse_create_index ( ) {
2718+ let sql = "CREATE INDEX foo ON myschema.bar (a, b)" ;
2719+ match verified_stmt ( sql) {
2720+ Statement :: CreateIndex {
2721+ name,
2722+ on_name,
2723+ key_parts,
2724+ } => {
2725+ assert_eq ! ( "foo" , name. to_string( ) ) ;
2726+ assert_eq ! ( "myschema.bar" , on_name. to_string( ) ) ;
2727+ assert_eq ! (
2728+ key_parts,
2729+ vec![
2730+ Expr :: Identifier ( "a" . to_string( ) ) ,
2731+ Expr :: Identifier ( "b" . to_string( ) )
2732+ ]
2733+ ) ;
2734+ }
2735+ _ => assert ! ( false ) ,
2736+ }
2737+
2738+ let sql = "CREATE INDEX fizz ON baz (ascii(x), a IS NOT NULL, (EXISTS (SELECT y FROM boop WHERE boop.z = z)), delta)" ;
2739+ match verified_stmt ( sql) {
2740+ Statement :: CreateIndex {
2741+ name,
2742+ on_name,
2743+ key_parts,
2744+ } => {
2745+ assert_eq ! ( "fizz" , name. to_string( ) ) ;
2746+ assert_eq ! ( "baz" , on_name. to_string( ) ) ;
2747+ assert_matches ! ( key_parts[ 0 ] , Expr :: Function ( ..) ) ;
2748+ assert_eq ! (
2749+ key_parts[ 1 ] ,
2750+ Expr :: IsNotNull ( Box :: new( Expr :: Identifier ( "a" . to_string( ) ) ) )
2751+ ) ;
2752+ if let Expr :: Nested ( expr) = & key_parts[ 2 ] {
2753+ assert_matches ! ( * * expr, Expr :: Exists ( ..) ) ;
2754+ } else {
2755+ assert ! ( false ) ;
2756+ }
2757+ assert_eq ! ( key_parts[ 3 ] , Expr :: Identifier ( "delta" . to_string( ) ) ) ;
2758+ }
2759+ _ => assert ! ( false ) ,
2760+ }
2761+
2762+ let sql = "CREATE INDEX ind ON tab ((col + 1))" ;
2763+ match verified_stmt ( sql) {
2764+ Statement :: CreateIndex {
2765+ name,
2766+ on_name,
2767+ key_parts,
2768+ } => {
2769+ assert_eq ! ( "ind" , name. to_string( ) ) ;
2770+ assert_eq ! ( "tab" , on_name. to_string( ) ) ;
2771+ assert_eq ! (
2772+ key_parts,
2773+ vec![ Expr :: Nested ( Box :: new( Expr :: BinaryOp {
2774+ left: Box :: new( Expr :: Identifier ( "col" . to_string( ) ) ) ,
2775+ op: BinaryOperator :: Plus ,
2776+ right: Box :: new( Expr :: Value ( Value :: Number ( "1" . to_string( ) ) ) )
2777+ } ) ) ] ,
2778+ ) ;
2779+ }
2780+ _ => assert ! ( false ) ,
2781+ }
2782+ let sql = "CREATE INDEX qualifiers ON no_parentheses (alpha.omega)" ;
2783+ match verified_stmt ( sql) {
2784+ Statement :: CreateIndex {
2785+ name,
2786+ on_name,
2787+ key_parts,
2788+ } => {
2789+ assert_eq ! ( "qualifiers" , name. to_string( ) ) ;
2790+ assert_eq ! ( "no_parentheses" , on_name. to_string( ) ) ;
2791+ assert_eq ! (
2792+ key_parts,
2793+ vec![ Expr :: CompoundIdentifier ( vec![
2794+ "alpha" . to_string( ) ,
2795+ "omega" . to_string( )
2796+ ] ) ] ,
2797+ ) ;
2798+ }
2799+ _ => assert ! ( false ) ,
2800+ }
2801+ }
2802+
2803+ #[ test]
2804+ fn parse_invalid_create_index ( ) {
2805+ // Index names should not have a schema in front of it
2806+ let res = parse_sql_statements ( "CREATE INDEX myschema.ind ON foo(b)" ) ;
2807+ assert_eq ! (
2808+ ParserError :: ParserError ( "Expected ON, found: ." . to_string( ) ) ,
2809+ res. unwrap_err( ) ,
2810+ ) ;
2811+ }
2812+
27142813#[ test]
27152814fn parse_drop_table ( ) {
27162815 let sql = "DROP TABLE foo" ;
@@ -2803,6 +2902,28 @@ fn parse_drop_source() {
28032902 }
28042903}
28052904
2905+ #[ test]
2906+ fn parse_drop_index ( ) {
2907+ let sql = "DROP INDEX IF EXISTS myschema.myindex" ;
2908+ match verified_stmt ( sql) {
2909+ Statement :: Drop {
2910+ object_type,
2911+ if_exists,
2912+ names,
2913+ cascade,
2914+ } => {
2915+ assert_eq ! ( true , if_exists) ;
2916+ assert_eq ! (
2917+ vec![ "myschema.myindex" ] ,
2918+ names. iter( ) . map( |n| n. to_string( ) ) . collect:: <Vec <_>>( )
2919+ ) ;
2920+ assert_eq ! ( false , cascade) ;
2921+ assert_eq ! ( ObjectType :: Index , object_type) ;
2922+ }
2923+ _ => unreachable ! ( ) ,
2924+ }
2925+ }
2926+
28062927#[ test]
28072928fn parse_peek ( ) {
28082929 let sql = "PEEK foo.bar" ;
0 commit comments