Execute a SELECT with dynamic ORDER BY expression inside a function










0















I'm trying to EXECUTE some SELECTs to use inside a function, my code is something like this:



DECLARE
result_one record;

BEGIN
EXECUTE 'WITH Q1 AS
(
SELECT id
FROM table_two
INNER JOINs, WHERE, etc, ORDER BY... DESC
)

SELECT Q1.id
FROM Q1
WHERE, ORDER BY...DESC';

RETURN final_result;
END;


I know how to do it in MySQL, but in PostgreSQL I'm failing. What should I change or how should I do it?










share|improve this question
























  • It's not obvious (to me at least) why you are using EXECUTE, or what results you expect from this query. There's no reason for the above code to even be in plpgsql - you could just use a SQL function

    – Richard Huxton
    Nov 12 '18 at 15:28











  • I know, the selects are examples, I need to know how to use the execute in this case. Those select has dynamic parameters, and some people will edit the parameters through CLI, long story.

    – pmirnd
    Nov 12 '18 at 15:30












  • Then you will need to give a more accurate example if you want people to figure out what your problem is. That code just isn't returning any results and I can't see why you would expect it to. You have read the relevant part of the manuals (postgresql.org/docs/11/…) haven't you?

    – Richard Huxton
    Nov 12 '18 at 15:43











  • Note that functions are distinct from procedures, so "stored procedure" (SP) is a misleading term when referring to a function. See: dba.stackexchange.com/a/194811/3684

    – Erwin Brandstetter
    Nov 13 '18 at 22:50















0















I'm trying to EXECUTE some SELECTs to use inside a function, my code is something like this:



DECLARE
result_one record;

BEGIN
EXECUTE 'WITH Q1 AS
(
SELECT id
FROM table_two
INNER JOINs, WHERE, etc, ORDER BY... DESC
)

SELECT Q1.id
FROM Q1
WHERE, ORDER BY...DESC';

RETURN final_result;
END;


I know how to do it in MySQL, but in PostgreSQL I'm failing. What should I change or how should I do it?










share|improve this question
























  • It's not obvious (to me at least) why you are using EXECUTE, or what results you expect from this query. There's no reason for the above code to even be in plpgsql - you could just use a SQL function

    – Richard Huxton
    Nov 12 '18 at 15:28











  • I know, the selects are examples, I need to know how to use the execute in this case. Those select has dynamic parameters, and some people will edit the parameters through CLI, long story.

    – pmirnd
    Nov 12 '18 at 15:30












  • Then you will need to give a more accurate example if you want people to figure out what your problem is. That code just isn't returning any results and I can't see why you would expect it to. You have read the relevant part of the manuals (postgresql.org/docs/11/…) haven't you?

    – Richard Huxton
    Nov 12 '18 at 15:43











  • Note that functions are distinct from procedures, so "stored procedure" (SP) is a misleading term when referring to a function. See: dba.stackexchange.com/a/194811/3684

    – Erwin Brandstetter
    Nov 13 '18 at 22:50













0












0








0








I'm trying to EXECUTE some SELECTs to use inside a function, my code is something like this:



DECLARE
result_one record;

BEGIN
EXECUTE 'WITH Q1 AS
(
SELECT id
FROM table_two
INNER JOINs, WHERE, etc, ORDER BY... DESC
)

SELECT Q1.id
FROM Q1
WHERE, ORDER BY...DESC';

RETURN final_result;
END;


I know how to do it in MySQL, but in PostgreSQL I'm failing. What should I change or how should I do it?










share|improve this question
















I'm trying to EXECUTE some SELECTs to use inside a function, my code is something like this:



DECLARE
result_one record;

BEGIN
EXECUTE 'WITH Q1 AS
(
SELECT id
FROM table_two
INNER JOINs, WHERE, etc, ORDER BY... DESC
)

SELECT Q1.id
FROM Q1
WHERE, ORDER BY...DESC';

RETURN final_result;
END;


I know how to do it in MySQL, but in PostgreSQL I'm failing. What should I change or how should I do it?







postgresql plpgsql common-table-expression dynamic-sql stored-functions






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 13 '18 at 22:47









Erwin Brandstetter

341k65624799




341k65624799










asked Nov 12 '18 at 15:24









pmirndpmirnd

72021130




72021130












  • It's not obvious (to me at least) why you are using EXECUTE, or what results you expect from this query. There's no reason for the above code to even be in plpgsql - you could just use a SQL function

    – Richard Huxton
    Nov 12 '18 at 15:28











  • I know, the selects are examples, I need to know how to use the execute in this case. Those select has dynamic parameters, and some people will edit the parameters through CLI, long story.

    – pmirnd
    Nov 12 '18 at 15:30












  • Then you will need to give a more accurate example if you want people to figure out what your problem is. That code just isn't returning any results and I can't see why you would expect it to. You have read the relevant part of the manuals (postgresql.org/docs/11/…) haven't you?

    – Richard Huxton
    Nov 12 '18 at 15:43











  • Note that functions are distinct from procedures, so "stored procedure" (SP) is a misleading term when referring to a function. See: dba.stackexchange.com/a/194811/3684

    – Erwin Brandstetter
    Nov 13 '18 at 22:50

















  • It's not obvious (to me at least) why you are using EXECUTE, or what results you expect from this query. There's no reason for the above code to even be in plpgsql - you could just use a SQL function

    – Richard Huxton
    Nov 12 '18 at 15:28











  • I know, the selects are examples, I need to know how to use the execute in this case. Those select has dynamic parameters, and some people will edit the parameters through CLI, long story.

    – pmirnd
    Nov 12 '18 at 15:30












  • Then you will need to give a more accurate example if you want people to figure out what your problem is. That code just isn't returning any results and I can't see why you would expect it to. You have read the relevant part of the manuals (postgresql.org/docs/11/…) haven't you?

    – Richard Huxton
    Nov 12 '18 at 15:43











  • Note that functions are distinct from procedures, so "stored procedure" (SP) is a misleading term when referring to a function. See: dba.stackexchange.com/a/194811/3684

    – Erwin Brandstetter
    Nov 13 '18 at 22:50
















It's not obvious (to me at least) why you are using EXECUTE, or what results you expect from this query. There's no reason for the above code to even be in plpgsql - you could just use a SQL function

– Richard Huxton
Nov 12 '18 at 15:28





It's not obvious (to me at least) why you are using EXECUTE, or what results you expect from this query. There's no reason for the above code to even be in plpgsql - you could just use a SQL function

– Richard Huxton
Nov 12 '18 at 15:28













I know, the selects are examples, I need to know how to use the execute in this case. Those select has dynamic parameters, and some people will edit the parameters through CLI, long story.

– pmirnd
Nov 12 '18 at 15:30






I know, the selects are examples, I need to know how to use the execute in this case. Those select has dynamic parameters, and some people will edit the parameters through CLI, long story.

– pmirnd
Nov 12 '18 at 15:30














Then you will need to give a more accurate example if you want people to figure out what your problem is. That code just isn't returning any results and I can't see why you would expect it to. You have read the relevant part of the manuals (postgresql.org/docs/11/…) haven't you?

– Richard Huxton
Nov 12 '18 at 15:43





Then you will need to give a more accurate example if you want people to figure out what your problem is. That code just isn't returning any results and I can't see why you would expect it to. You have read the relevant part of the manuals (postgresql.org/docs/11/…) haven't you?

– Richard Huxton
Nov 12 '18 at 15:43













Note that functions are distinct from procedures, so "stored procedure" (SP) is a misleading term when referring to a function. See: dba.stackexchange.com/a/194811/3684

– Erwin Brandstetter
Nov 13 '18 at 22:50





Note that functions are distinct from procedures, so "stored procedure" (SP) is a misleading term when referring to a function. See: dba.stackexchange.com/a/194811/3684

– Erwin Brandstetter
Nov 13 '18 at 22:50












2 Answers
2






active

oldest

votes


















1














For a function to be able to return multiple rows it has to be declared as returns table() (or returns setof)



And to actually return a result from within a PL/pgSQL function you need to use return query (as documented in the manual)



To build dynamic SQL in Postgres it is highly recommended to use the format() function to properly deal with identifiers (and to make the source easier to read).



So you need something like:



create or replace function get_data(p_sort_column text)
returns table (id integer)
as
$$
begin
return query execute
format(
'with q1 as (
select id
from table_two
join table_three on ...
)
select q1.id
from q1
order by %I desc', p_sort_column);
end;
$$
language plpgsql;


Note that the order by inside the CTE is pretty much useless if you are sorting the final query unless you use a LIMIT or distinct on () inside the query.




You can make your life even easier if you use another level of dollar quoting for the dynamic SQL:



create or replace function get_data(p_sort_column text)
returns table (id integer)
as
$$
begin
return query execute
format(
$query$
with q1 as (
select id
from table_two
join table_three on ...
)
select q1.id
from q1
order by %I desc
$query$, p_sort_column);
end;
$$
language plpgsql;





share|improve this answer






























    0














    What a_horse said. And:



    • How to return result of a SELECT inside a function in PostgreSQL?

    Plus, to pick a column for ORDER BY dynamically, you have to add that column to the SELECT list of your CTE, which leads to complications if the column can be duplicated (like with passing 'id') ...



    Better yet, remove the CTE entirely. There is nothing in your question to warrant its use anyway. (Only use CTEs when needed in Postgres, they are typically slower than equivalent subqueries or simple queries.)



    CREATE OR REPLACE FUNCTION get_data(p_sort_column text)
    RETURNS TABLE (id integer) AS
    $func$
    BEGIN
    RETURN QUERY EXECUTE format(
    $q$
    SELECT t2.id -- assuming you meant t2?
    FROM table_two t2
    JOIN table_three t3 on ...
    ORDER BY t2.%I DESC NULL LAST -- see below!
    $q$, $1);
    END
    $func$ LANGUAGE plpgsql;


    I appended NULLS LAST - you'll probably want that, too:



    • PostgreSQL sort by datetime asc, null first?

    If p_sort_column is from the same table all the time, hard-code that table name / alias in the ORDER BY clause. Else, pass the table name / alias separately and auto-quote them separately to be safe:



    • Define table and column names as arguments in a plpgsql function?

    I suggest to table-qualify all column names in a bigger query with multiple joins (t2.id not just id). Avoids various kinds of surprising results / confusion / abuse.



    And you may want to schema-qualify your table names (myschema.table_two) to avoid similar troubles when calling the function with a different search_path:



    • How does the search_path influence identifier resolution and the "current schema"





    share|improve this answer
























      Your Answer






      StackExchange.ifUsing("editor", function ()
      StackExchange.using("externalEditor", function ()
      StackExchange.using("snippets", function ()
      StackExchange.snippets.init();
      );
      );
      , "code-snippets");

      StackExchange.ready(function()
      var channelOptions =
      tags: "".split(" "),
      id: "1"
      ;
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function()
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled)
      StackExchange.using("snippets", function()
      createEditor();
      );

      else
      createEditor();

      );

      function createEditor()
      StackExchange.prepareEditor(
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader:
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      ,
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      );



      );













      draft saved

      draft discarded


















      StackExchange.ready(
      function ()
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53265229%2fexecute-a-select-with-dynamic-order-by-expression-inside-a-function%23new-answer', 'question_page');

      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      1














      For a function to be able to return multiple rows it has to be declared as returns table() (or returns setof)



      And to actually return a result from within a PL/pgSQL function you need to use return query (as documented in the manual)



      To build dynamic SQL in Postgres it is highly recommended to use the format() function to properly deal with identifiers (and to make the source easier to read).



      So you need something like:



      create or replace function get_data(p_sort_column text)
      returns table (id integer)
      as
      $$
      begin
      return query execute
      format(
      'with q1 as (
      select id
      from table_two
      join table_three on ...
      )
      select q1.id
      from q1
      order by %I desc', p_sort_column);
      end;
      $$
      language plpgsql;


      Note that the order by inside the CTE is pretty much useless if you are sorting the final query unless you use a LIMIT or distinct on () inside the query.




      You can make your life even easier if you use another level of dollar quoting for the dynamic SQL:



      create or replace function get_data(p_sort_column text)
      returns table (id integer)
      as
      $$
      begin
      return query execute
      format(
      $query$
      with q1 as (
      select id
      from table_two
      join table_three on ...
      )
      select q1.id
      from q1
      order by %I desc
      $query$, p_sort_column);
      end;
      $$
      language plpgsql;





      share|improve this answer



























        1














        For a function to be able to return multiple rows it has to be declared as returns table() (or returns setof)



        And to actually return a result from within a PL/pgSQL function you need to use return query (as documented in the manual)



        To build dynamic SQL in Postgres it is highly recommended to use the format() function to properly deal with identifiers (and to make the source easier to read).



        So you need something like:



        create or replace function get_data(p_sort_column text)
        returns table (id integer)
        as
        $$
        begin
        return query execute
        format(
        'with q1 as (
        select id
        from table_two
        join table_three on ...
        )
        select q1.id
        from q1
        order by %I desc', p_sort_column);
        end;
        $$
        language plpgsql;


        Note that the order by inside the CTE is pretty much useless if you are sorting the final query unless you use a LIMIT or distinct on () inside the query.




        You can make your life even easier if you use another level of dollar quoting for the dynamic SQL:



        create or replace function get_data(p_sort_column text)
        returns table (id integer)
        as
        $$
        begin
        return query execute
        format(
        $query$
        with q1 as (
        select id
        from table_two
        join table_three on ...
        )
        select q1.id
        from q1
        order by %I desc
        $query$, p_sort_column);
        end;
        $$
        language plpgsql;





        share|improve this answer

























          1












          1








          1







          For a function to be able to return multiple rows it has to be declared as returns table() (or returns setof)



          And to actually return a result from within a PL/pgSQL function you need to use return query (as documented in the manual)



          To build dynamic SQL in Postgres it is highly recommended to use the format() function to properly deal with identifiers (and to make the source easier to read).



          So you need something like:



          create or replace function get_data(p_sort_column text)
          returns table (id integer)
          as
          $$
          begin
          return query execute
          format(
          'with q1 as (
          select id
          from table_two
          join table_three on ...
          )
          select q1.id
          from q1
          order by %I desc', p_sort_column);
          end;
          $$
          language plpgsql;


          Note that the order by inside the CTE is pretty much useless if you are sorting the final query unless you use a LIMIT or distinct on () inside the query.




          You can make your life even easier if you use another level of dollar quoting for the dynamic SQL:



          create or replace function get_data(p_sort_column text)
          returns table (id integer)
          as
          $$
          begin
          return query execute
          format(
          $query$
          with q1 as (
          select id
          from table_two
          join table_three on ...
          )
          select q1.id
          from q1
          order by %I desc
          $query$, p_sort_column);
          end;
          $$
          language plpgsql;





          share|improve this answer













          For a function to be able to return multiple rows it has to be declared as returns table() (or returns setof)



          And to actually return a result from within a PL/pgSQL function you need to use return query (as documented in the manual)



          To build dynamic SQL in Postgres it is highly recommended to use the format() function to properly deal with identifiers (and to make the source easier to read).



          So you need something like:



          create or replace function get_data(p_sort_column text)
          returns table (id integer)
          as
          $$
          begin
          return query execute
          format(
          'with q1 as (
          select id
          from table_two
          join table_three on ...
          )
          select q1.id
          from q1
          order by %I desc', p_sort_column);
          end;
          $$
          language plpgsql;


          Note that the order by inside the CTE is pretty much useless if you are sorting the final query unless you use a LIMIT or distinct on () inside the query.




          You can make your life even easier if you use another level of dollar quoting for the dynamic SQL:



          create or replace function get_data(p_sort_column text)
          returns table (id integer)
          as
          $$
          begin
          return query execute
          format(
          $query$
          with q1 as (
          select id
          from table_two
          join table_three on ...
          )
          select q1.id
          from q1
          order by %I desc
          $query$, p_sort_column);
          end;
          $$
          language plpgsql;






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 12 '18 at 15:45









          a_horse_with_no_namea_horse_with_no_name

          294k46451544




          294k46451544























              0














              What a_horse said. And:



              • How to return result of a SELECT inside a function in PostgreSQL?

              Plus, to pick a column for ORDER BY dynamically, you have to add that column to the SELECT list of your CTE, which leads to complications if the column can be duplicated (like with passing 'id') ...



              Better yet, remove the CTE entirely. There is nothing in your question to warrant its use anyway. (Only use CTEs when needed in Postgres, they are typically slower than equivalent subqueries or simple queries.)



              CREATE OR REPLACE FUNCTION get_data(p_sort_column text)
              RETURNS TABLE (id integer) AS
              $func$
              BEGIN
              RETURN QUERY EXECUTE format(
              $q$
              SELECT t2.id -- assuming you meant t2?
              FROM table_two t2
              JOIN table_three t3 on ...
              ORDER BY t2.%I DESC NULL LAST -- see below!
              $q$, $1);
              END
              $func$ LANGUAGE plpgsql;


              I appended NULLS LAST - you'll probably want that, too:



              • PostgreSQL sort by datetime asc, null first?

              If p_sort_column is from the same table all the time, hard-code that table name / alias in the ORDER BY clause. Else, pass the table name / alias separately and auto-quote them separately to be safe:



              • Define table and column names as arguments in a plpgsql function?

              I suggest to table-qualify all column names in a bigger query with multiple joins (t2.id not just id). Avoids various kinds of surprising results / confusion / abuse.



              And you may want to schema-qualify your table names (myschema.table_two) to avoid similar troubles when calling the function with a different search_path:



              • How does the search_path influence identifier resolution and the "current schema"





              share|improve this answer





























                0














                What a_horse said. And:



                • How to return result of a SELECT inside a function in PostgreSQL?

                Plus, to pick a column for ORDER BY dynamically, you have to add that column to the SELECT list of your CTE, which leads to complications if the column can be duplicated (like with passing 'id') ...



                Better yet, remove the CTE entirely. There is nothing in your question to warrant its use anyway. (Only use CTEs when needed in Postgres, they are typically slower than equivalent subqueries or simple queries.)



                CREATE OR REPLACE FUNCTION get_data(p_sort_column text)
                RETURNS TABLE (id integer) AS
                $func$
                BEGIN
                RETURN QUERY EXECUTE format(
                $q$
                SELECT t2.id -- assuming you meant t2?
                FROM table_two t2
                JOIN table_three t3 on ...
                ORDER BY t2.%I DESC NULL LAST -- see below!
                $q$, $1);
                END
                $func$ LANGUAGE plpgsql;


                I appended NULLS LAST - you'll probably want that, too:



                • PostgreSQL sort by datetime asc, null first?

                If p_sort_column is from the same table all the time, hard-code that table name / alias in the ORDER BY clause. Else, pass the table name / alias separately and auto-quote them separately to be safe:



                • Define table and column names as arguments in a plpgsql function?

                I suggest to table-qualify all column names in a bigger query with multiple joins (t2.id not just id). Avoids various kinds of surprising results / confusion / abuse.



                And you may want to schema-qualify your table names (myschema.table_two) to avoid similar troubles when calling the function with a different search_path:



                • How does the search_path influence identifier resolution and the "current schema"





                share|improve this answer



























                  0












                  0








                  0







                  What a_horse said. And:



                  • How to return result of a SELECT inside a function in PostgreSQL?

                  Plus, to pick a column for ORDER BY dynamically, you have to add that column to the SELECT list of your CTE, which leads to complications if the column can be duplicated (like with passing 'id') ...



                  Better yet, remove the CTE entirely. There is nothing in your question to warrant its use anyway. (Only use CTEs when needed in Postgres, they are typically slower than equivalent subqueries or simple queries.)



                  CREATE OR REPLACE FUNCTION get_data(p_sort_column text)
                  RETURNS TABLE (id integer) AS
                  $func$
                  BEGIN
                  RETURN QUERY EXECUTE format(
                  $q$
                  SELECT t2.id -- assuming you meant t2?
                  FROM table_two t2
                  JOIN table_three t3 on ...
                  ORDER BY t2.%I DESC NULL LAST -- see below!
                  $q$, $1);
                  END
                  $func$ LANGUAGE plpgsql;


                  I appended NULLS LAST - you'll probably want that, too:



                  • PostgreSQL sort by datetime asc, null first?

                  If p_sort_column is from the same table all the time, hard-code that table name / alias in the ORDER BY clause. Else, pass the table name / alias separately and auto-quote them separately to be safe:



                  • Define table and column names as arguments in a plpgsql function?

                  I suggest to table-qualify all column names in a bigger query with multiple joins (t2.id not just id). Avoids various kinds of surprising results / confusion / abuse.



                  And you may want to schema-qualify your table names (myschema.table_two) to avoid similar troubles when calling the function with a different search_path:



                  • How does the search_path influence identifier resolution and the "current schema"





                  share|improve this answer















                  What a_horse said. And:



                  • How to return result of a SELECT inside a function in PostgreSQL?

                  Plus, to pick a column for ORDER BY dynamically, you have to add that column to the SELECT list of your CTE, which leads to complications if the column can be duplicated (like with passing 'id') ...



                  Better yet, remove the CTE entirely. There is nothing in your question to warrant its use anyway. (Only use CTEs when needed in Postgres, they are typically slower than equivalent subqueries or simple queries.)



                  CREATE OR REPLACE FUNCTION get_data(p_sort_column text)
                  RETURNS TABLE (id integer) AS
                  $func$
                  BEGIN
                  RETURN QUERY EXECUTE format(
                  $q$
                  SELECT t2.id -- assuming you meant t2?
                  FROM table_two t2
                  JOIN table_three t3 on ...
                  ORDER BY t2.%I DESC NULL LAST -- see below!
                  $q$, $1);
                  END
                  $func$ LANGUAGE plpgsql;


                  I appended NULLS LAST - you'll probably want that, too:



                  • PostgreSQL sort by datetime asc, null first?

                  If p_sort_column is from the same table all the time, hard-code that table name / alias in the ORDER BY clause. Else, pass the table name / alias separately and auto-quote them separately to be safe:



                  • Define table and column names as arguments in a plpgsql function?

                  I suggest to table-qualify all column names in a bigger query with multiple joins (t2.id not just id). Avoids various kinds of surprising results / confusion / abuse.



                  And you may want to schema-qualify your table names (myschema.table_two) to avoid similar troubles when calling the function with a different search_path:



                  • How does the search_path influence identifier resolution and the "current schema"






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Nov 17 '18 at 17:13

























                  answered Nov 13 '18 at 22:44









                  Erwin BrandstetterErwin Brandstetter

                  341k65624799




                  341k65624799



























                      draft saved

                      draft discarded
















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid


                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.

                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function ()
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53265229%2fexecute-a-select-with-dynamic-order-by-expression-inside-a-function%23new-answer', 'question_page');

                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Kleinkühnau

                      Makov (Slowakei)

                      Deutsches Schauspielhaus