@@ -567,43 +567,56 @@ export class SymbolResolver {
567567 let methodStore = SQLMethodStore . getInstance ( ) ;
568568 let methods = methodStore . getMethods ( node . identifier ) ;
569569
570- methods = methods . filter ( m => m . parameters . length == node . operands . length ) ;
571- if ( node . operands . length == 1 && node . operands [ 0 ] . type == TokenType . allColumns ) {
572- methods = methods . filter ( m => m . acceptsStarParameter ) ;
573- node . sqlType = methods [ 0 ] . returnType ;
574- return node . sqlType ;
575- }
570+ if ( node . identifier . toLocaleLowerCase ( ) == 'concat' ) {
571+ if ( node . operands . length == 0 ) {
572+ this . pushError ( "Die Methode concat benötigt mindestens einen Parameter." , "error" , node . position ) ;
573+ return null ;
574+ }
575+ let method = methods [ 0 ] ;
576+ node . sqlType = method . returnType ;
576577
577- if ( methods . length == 0 ) {
578- this . pushError ( "Es gibt keine passende Methode mit dem Bezeichner '" + node . identifier + "'." , "error" , node . position ) ;
579- return null ;
580- }
578+ return node . sqlType ;
579+ } else {
581580
582- for ( let operand of node . operands ) {
583- if ( this . resolveTerm ( operand ) == null ) {
581+ methods = methods . filter ( m => m . parameters . length == node . operands . length ) ;
582+ if ( node . operands . length == 1 && node . operands [ 0 ] . type == TokenType . allColumns ) {
583+ methods = methods . filter ( m => m . acceptsStarParameter ) ;
584584 node . sqlType = methods [ 0 ] . returnType ;
585585 return node . sqlType ;
586586 }
587- }
588587
589- for ( let method of methods ) {
590- let found = true ;
591- for ( let i = 0 ; i < method . parameters . length ; i ++ ) {
592- let methodParameter = method . parameters [ i ] ;
593- let operand = node . operands [ i ] ;
594- if ( ! operand . sqlType . canCastTo ( methodParameter . type ) ) {
595- found = false ;
596- break ;
588+ if ( methods . length == 0 ) {
589+ this . pushError ( "Es gibt keine passende Methode mit dem Bezeichner '" + node . identifier + "'." , "error" , node . position ) ;
590+ return null ;
591+ }
592+
593+ for ( let operand of node . operands ) {
594+ if ( this . resolveTerm ( operand ) == null ) {
595+ node . sqlType = methods [ 0 ] . returnType ;
596+ return node . sqlType ;
597597 }
598598 }
599- if ( found ) {
600- node . sqlType = method . returnType ;
601- return node . sqlType ;
599+
600+ for ( let method of methods ) {
601+ let found = true ;
602+ for ( let i = 0 ; i < method . parameters . length ; i ++ ) {
603+ let methodParameter = method . parameters [ i ] ;
604+ let operand = node . operands [ i ] ;
605+ if ( ! operand . sqlType . canCastTo ( methodParameter . type ) ) {
606+ found = false ;
607+ break ;
608+ }
609+ }
610+ if ( found ) {
611+ node . sqlType = method . returnType ;
612+ return node . sqlType ;
613+ }
602614 }
615+
616+ this . pushError ( "Es gibt keine passende Methode mit dem Bezeichner '" + node . identifier + "'." , "error" , node . position ) ;
617+ return null ;
603618 }
604619
605- this . pushError ( "Es gibt keine passende Methode mit dem Bezeichner '" + node . identifier + "'." , "error" , node . position ) ;
606- return null ;
607620
608621 }
609622
@@ -693,18 +706,18 @@ export class SymbolResolver {
693706 if ( columns . length > 0 ) {
694707 if ( astNode . select != null ) {
695708 let table = this . resolveSelect ( astNode . select ) ;
696- if ( table ?. columns != null ) {
697- if ( columns . length != table . columns . length ) {
709+ if ( table ?. columns != null ) {
710+ if ( columns . length != table . columns . length ) {
698711 this . pushError ( "Die insert-Anweisung erwartet " + columns . length + " Werte je Datensatz, die select-Anweisung liefert aber " + table . columns . length + "." , "error" , astNode . position ) ;
699712 } else {
700- for ( let i = 0 ; i < columns . length ; i ++ ) {
713+ for ( let i = 0 ; i < columns . length ; i ++ ) {
701714 let insertColumn = columns [ i ] ;
702715 let selectColumn = table . columns [ i ] ;
703- if ( insertColumn . type != null && selectColumn . type != null ) {
704- if ( ! selectColumn . type . canCastTo ( insertColumn . type ) ) {
705- this . pushError ( "Der Datentyp " + selectColumn . type . toString ( ) + " der "
706- + ( i + 1 ) + "-ten Spalte des select-Terms kann nicht in den Datentyp " +
707- insertColumn . type . toString ( ) + " der entsprechenden Spalte der insert-Anweisung umgewandelt werden." , "error" , astNode . position ) ;
716+ if ( insertColumn . type != null && selectColumn . type != null ) {
717+ if ( ! selectColumn . type . canCastTo ( insertColumn . type ) ) {
718+ this . pushError ( "Der Datentyp " + selectColumn . type . toString ( ) + " der "
719+ + ( i + 1 ) + "-ten Spalte des select-Terms kann nicht in den Datentyp " +
720+ insertColumn . type . toString ( ) + " der entsprechenden Spalte der insert-Anweisung umgewandelt werden." , "error" , astNode . position ) ;
708721 }
709722 }
710723 }
0 commit comments